示例#1
0
        public void GenerateNuSpecForStub()
        {
            var pkg  = m_packageGenerator.AnalyzePackageStub(s_packagesOnConfig);
            var spec = new NugetSpecGenerator(m_context.PathTable, pkg).CreateScriptSourceFile(pkg);
            var text = spec.ToDisplayStringV2();

            m_output.WriteLine(text);

            string expectedSpec = @"import {Transformer} from ""Sdk.Transformers"";

export declare const qualifier: {
    targetFramework: ""net10"" | ""net11"" | ""net20"" | ""net35"" | ""net40"" | ""net45"" | ""net451"" | ""net452"" | ""net46"" | ""net461"" | ""net462"" | ""net472"" | ""netstandard1.0"" | ""netstandard1.1"" | ""netstandard1.2"" | ""netstandard1.3"" | ""netstandard1.4"" | ""netstandard1.5"" | ""netstandard1.6"" | ""netstandard2.0"" | ""netcoreapp2.0"" | ""netcoreapp2.1"" | ""netcoreapp2.2"" | ""netcoreapp3.0"" | ""netcoreapp3.1"" | ""netstandard2.1"",
    targetRuntime: ""win-x64"" | ""osx-x64"" | ""linux-x64"",
};

const packageRoot = Contents.packageRoot;

namespace Contents {
    export declare const qualifier: {
    };
    export const packageRoot = d`../../../pkgs/TestPkgStub.1.999`;
    @@public
    export const all: StaticDirectory = Transformer.sealDirectory(packageRoot, []);
}

@@public
export const pkg: NugetPackage = {contents: Contents.all, dependencies: []};";

            XAssert.ArrayEqual(SplitToLines(expectedSpec), SplitToLines(text));
        }
示例#2
0
        public void TestNuget451()
        {
            // Perform a random sample for some target framework moniker scenarios. Otherwise there are too many combinations.
            // This just guarantees a basic functionality of the moniker management and spec generator functionality.
            var stringTable = new PathTable().StringTable;
            var monikers    = new NugetFrameworkMonikers(stringTable);

            // Public member
            Assert.Equal("net451", monikers.Net451.ToString(stringTable));
            Assert.Equal("net452", monikers.Net452.ToString(stringTable));

            // Is well known
            Assert.True(monikers.WellknownMonikers.Contains(monikers.Net451));

            // 4.5 is compatible with 4.5.1 and newer monikers, not older ones!
            var analyzedPackage = m_packageGenerator.AnalyzePackage(
                @"<?xml version='1.0' encoding='utf-8'?>
<package xmlns='http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd'>
  <metadata>
    <id>MyPkg</id>
    <version>1.999</version>
    <dependencies>
      <group targetFramework='.NETFramework4.5'>
        <dependency id='System.Collections' version='4.0.11' />
        <dependency id='System.Collections.Concurrent' version='4.0.12' />
      </group>
    </dependencies>
  </metadata>
</package>", s_packagesOnConfig, new string[] { "lib/net45/my.dll" });

            List <PathAtom> compatibleTfms = new List <PathAtom>();

            NugetSpecGenerator.FindAllCompatibleFrameworkMonikers(analyzedPackage,
                                                                  (List <PathAtom> m) => compatibleTfms.AddRange(m),
                                                                  m_monikers.FullFrameworkVersionHistory,
                                                                  m_monikers.NetCoreVersionHistory);

            Assert.False(compatibleTfms.Contains(m_monikers.Net40));
            Assert.True(compatibleTfms.Contains(m_monikers.Net45));
            Assert.True(compatibleTfms.Contains(m_monikers.Net451));
            Assert.True(compatibleTfms.Contains(m_monikers.Net472));

            // Mapping tests
            Assert.Equal(monikers.Net451, monikers.TargetFrameworkNameToMoniker[".NETFramework4.5.1"]);
        }
示例#3
0
        public void GenerateNuSpec()
        {
            var pkg = m_packageGenerator.AnalyzePackage(
                @"<?xml version='1.0' encoding='utf-8'?>
<package xmlns='http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd'>
  <metadata>
    <id>MyPkg</id>
    <version>1.999</version>
    <dependencies>
      <group targetFramework='.NETFramework4.5'>
        <dependency id='System.Collections' version='4.0.11' />
        <dependency id='System.Collections.Concurrent' version='4.0.12' />
      </group>
      <group targetFramework='.NETFramework4.5.1'>
        <dependency id='System.Collections' version='4.0.11' />
        <dependency id='System.Collections.Concurrent' version='4.0.12' />
      </group>
      <group targetFramework='.NETStandard2.0'>
        <dependency id='Newtonsoft.Json' version='10.0.0' exclude='Build,Analyzers' />
      </group>
    </dependencies>
  </metadata>
</package>",
                s_packagesOnConfig, new string[] { "lib/net45/my.dll", "lib/net451/my.dll", "lib/netstandard2.0/my.dll" });

            var spec = new NugetSpecGenerator(m_context.PathTable, pkg).CreateScriptSourceFile(pkg);
            var text = spec.ToDisplayStringV2();

            m_output.WriteLine(text);

            string expectedSpec = $@"import {{Transformer}} from ""Sdk.Transformers"";
import * as Managed from ""Sdk.Managed"";

export declare const qualifier: {{
    targetFramework: ""net45"" | ""net451"" | ""net452"" | ""net46"" | ""net461"" | ""net462"" | ""net472"" | ""netstandard2.0"" | ""netcoreapp2.0"" | ""netcoreapp2.1"" | ""netcoreapp2.2"" | ""netcoreapp3.0"" | ""netcoreapp3.1"" | ""netstandard2.1"",
    targetRuntime: ""win-x64"" | ""osx-x64"" | ""linux-x64"",
}};

const packageRoot = Contents.packageRoot;

namespace Contents {{
    export declare const qualifier: {{
    }};
    export const packageRoot = d`../../../pkgs/TestPkg.1.999`;
    @@public
    export const all: StaticDirectory = Transformer.sealDirectory(
        packageRoot,
        [
            f`${{packageRoot}}/lib/net45/my.dll`,
            f`${{packageRoot}}/lib/net451/my.dll`,
            f`${{packageRoot}}/lib/netstandard2.0/my.dll`,
            f`${{packageRoot}}/TestPkg.nuspec`,
        ]
    );
}}

@@public
export const pkg: Managed.ManagedNugetPackage = (() => {{
    switch (qualifier.targetFramework) {{
        case ""net45"":
            return Managed.Factory.createNugetPackage(
                ""TestPkg"",
                ""1.999"",
                Contents.all,
                [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net45/my.dll`)],
                [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net45/my.dll`)],
                [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg]
            );
        case ""net451"":
        case ""net452"":
        case ""net46"":
        case ""net461"":
        case ""net462"":
        case ""net472"":
            return Managed.Factory.createNugetPackage(
                ""TestPkg"",
                ""1.999"",
                Contents.all,
                [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net451/my.dll`)],
                [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net451/my.dll`)],
                [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg]
            );
        case ""netstandard2.0"":
        case ""netcoreapp2.0"":
        case ""netcoreapp2.1"":
        case ""netcoreapp2.2"":
        case ""netcoreapp3.0"":
        case ""netcoreapp3.1"":
        case ""netstandard2.1"":
            return Managed.Factory.createNugetPackage(
                ""TestPkg"",
                ""1.999"",
                Contents.all,
                [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/netstandard2.0/my.dll`)],
                [
                    Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/netstandard2.0/my.dll`),
                ],
                [...addIfLazy(qualifier.targetFramework === ""netstandard2.0"", () => [importFrom(""Newtonsoft.Json"").pkg])]
            );
        default:
            Contract.fail(""Unsupported target framework"");
    }};
}}
)();";

            XAssert.AreEqual(expectedSpec, text);

            const string CurrentSpecHash = "54628A3B7DB3041473955EE2FC145009CFD298A2";

            ValidateCurrentSpecGenVersion(expectedSpec, CurrentSpecHash);
        }
示例#4
0
        public void GenerateNuSpec()
        {
            var pkg = m_packageGenerator.AnalyzePackage(
                @"<?xml version='1.0' encoding='utf-8'?>
<package xmlns='http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd'>
  <metadata>
    <id>MyPkg</id>
    <version>1.999</version>
    <dependencies>
      <group targetFramework='.NETFramework4.5'>
        <dependency id='System.Collections' version='4.0.11' />
        <dependency id='System.Collections.Concurrent' version='4.0.12' />
      </group>
      <group targetFramework='.NETFramework4.5.1'>
        <dependency id='System.Collections' version='4.0.11' />
        <dependency id='System.Collections.Concurrent' version='4.0.12' />
      </group>
      <group targetFramework='.NETStandard2.0'>
        <dependency id='Newtonsoft.Json' version='10.0.0' exclude='Build,Analyzers' />
      </group>
    </dependencies>
  </metadata>
</package>",
                s_packagesOnConfig, new string[] { "lib/net45/my.dll", "lib/net451/my.dll", "lib/netstandard2.0/my.dll" });

            var spec = new NugetSpecGenerator(m_context.PathTable, pkg).CreateScriptSourceFile(pkg);
            var text = spec.ToDisplayStringV2();

            m_output.WriteLine(text);

            string expectedSpec = $@"import {{Transformer}} from ""Sdk.Transformers"";
import * as Managed from ""Sdk.Managed"";

export declare const qualifier: {{
    targetFramework: ""net45"" | ""net451"" | ""net452"" | ""net46"" | ""net461"" | ""net462"" | ""net472"" | ""netstandard2.0"" | ""netcoreapp2.0"" | ""netcoreapp2.1"" | ""netcoreapp2.2"" | ""netcoreapp3.0"" | ""netcoreapp3.1"" | ""netstandard2.1"",
    targetRuntime: ""win-x64"" | ""osx-x64"" | ""linux-x64"",
}};

const packageRoot = Contents.packageRoot;

namespace Contents {{
    export declare const qualifier: {{
    }};
    export const packageRoot = d`../../../pkgs/TestPkg.1.999`;
    @@public
    export const all: StaticDirectory = Transformer.sealDirectory(
        packageRoot,
        [
            f`${{packageRoot}}/lib/net45/my.dll`,
            f`${{packageRoot}}/lib/net451/my.dll`,
            f`${{packageRoot}}/lib/netstandard2.0/my.dll`,
            f`${{packageRoot}}/TestPkg.nuspec`,
        ]
    );
}}

@@public
export const pkg: Managed.ManagedNugetPackage = (() => {{
    switch (qualifier.targetFramework) {{
        case ""net45"":
            return Managed.Factory.createNugetPackage(
                ""TestPkg"",
                ""1.999"",
                Contents.all,
                [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net45/my.dll`)],
                [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net45/my.dll`)],
                [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg]
            );
        case ""net451"":
        case ""net452"":
        case ""net46"":
        case ""net461"":
        case ""net462"":
        case ""net472"":
            return Managed.Factory.createNugetPackage(
                ""TestPkg"",
                ""1.999"",
                Contents.all,
                [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net451/my.dll`)],
                [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net451/my.dll`)],
                [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg]
            );
        case ""netstandard2.0"":
        case ""netcoreapp2.0"":
        case ""netcoreapp2.1"":
        case ""netcoreapp2.2"":
        case ""netcoreapp3.0"":
        case ""netcoreapp3.1"":
        case ""netstandard2.1"":
            return Managed.Factory.createNugetPackage(
                ""TestPkg"",
                ""1.999"",
                Contents.all,
                [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/netstandard2.0/my.dll`)],
                [
                    Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/netstandard2.0/my.dll`),
                ],
                [...addIfLazy(qualifier.targetFramework === ""netstandard2.0"", () => [importFrom(""Newtonsoft.Json"").pkg])]
            );
        default:
            Contract.fail(""Unsupported target framework"");
    }};
}}
)();";

            XAssert.AreEqual(expectedSpec, text);
            var hashingHelper = new global::BuildXL.Storage.Fingerprints.HashingHelper(m_context.PathTable, recordFingerprintString: false);

            hashingHelper.Add(expectedSpec);
            var hash = BitConverter.ToString(hashingHelper.GenerateHashBytes()).Replace("-", string.Empty);

            const string CurrentSpecHash       = "54628A3B7DB3041473955EE2FC145009CFD298A2";
            const int    CurrentSpecGenVersion = 6;

            if (CurrentSpecHash != hash)
            {
                var hasFormatVersionIncreased = NugetSpecGenerator.SpecGenerationFormatVersion > CurrentSpecGenVersion;
                if (!hasFormatVersionIncreased)
                {
                    XAssert.Fail(
                        $@"
**********************************************************************************
** It looks like NuGet spec generation has changed but the version of 
** '{nameof(NugetSpecGenerator.SpecGenerationFormatVersion)}.{nameof(NugetSpecGenerator)}' didn't increase.
**
** Please bump up the spec generation format version from {CurrentSpecGenVersion} to {CurrentSpecGenVersion+1} and then
** update the '{nameof(CurrentSpecHash)}' and '{nameof(CurrentSpecGenVersion)}' values in this
** test to '{hash}' and '{CurrentSpecGenVersion+1}' respectively.
**********************************************************************************");
                }
                else
                {
                    var lines = new[]
                    {
                        $"Congratulations on remembering to increment '{nameof(NugetSpecGenerator.SpecGenerationFormatVersion)}.{nameof(NugetSpecGenerator)}'",
                        $"after updating NuGet spec generator!",
                        $"",
                        $"To keep this reminder working, please update the '{nameof(CurrentSpecHash)}' and '{nameof(CurrentSpecGenVersion)}'",
                        $"values in this unit test to '{hash}' and '{NugetSpecGenerator.SpecGenerationFormatVersion}' respectively.",
                    };
                    const int width   = 94;
                    var       fst     = " " + String.Concat(Enumerable.Repeat("_", width + 2)) + " ";
                    var       snd     = $"/ {' ',-width} \\";
                    var       aligned = lines.Select(l => $"| {l,-width} |");
                    var       last    = "\\" + String.Concat(Enumerable.Repeat("_", width + 2)) + "/";
                    XAssert.Fail(string.Join(Environment.NewLine, new[] { fst, snd }.Concat(aligned).Concat(new[] { last })));
                }
            }
        }
示例#5
0
        public void GenerateNuSpec()
        {
            var epectedpackageRoot = "../../../pkgs/TestPkg.1.999";

            var pkg = m_packageGenerator.AnalyzePackage(
                @"<?xml version='1.0' encoding='utf-8'?>
<package xmlns='http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd'>
  <metadata>
    <id>MyPkg</id>
    <version>1.999</version>
    <dependencies>
      <group targetFramework='.NETFramework4.5'>
        <dependency id='System.Collections' version='4.0.11' />
        <dependency id='System.Collections.Concurrent' version='4.0.12' />
      </group>
      <group targetFramework='.NETFramework4.5.1'>
        <dependency id='System.Collections' version='4.0.11' />
        <dependency id='System.Collections.Concurrent' version='4.0.12' />
      </group>
    </dependencies>
  </metadata>
</package>",
                s_packagesOnConfig);

            var spec = new NugetSpecGenerator(m_context.PathTable, pkg).CreateScriptSourceFile(pkg);
            var text = spec.ToDisplayStringV2();

            m_output.WriteLine(text);
            string expectedSpec = string.Format(@"import {{Transformer}} from ""Sdk.Transformers"";
import * as Managed from ""Sdk.Managed"";

export declare const qualifier: {{targetFramework: ""net472"" | ""net461"" | ""net451"" | ""net45""}};

const packageRoot = Contents.packageRoot;

namespace Contents {{
    export declare const qualifier: {{
    }};
    export const packageRoot = d`{0}`;
    @@public
    export const all: StaticDirectory = Transformer.sealDirectory(packageRoot, [f`${{packageRoot}}/TestPkg.nuspec`]);
}}

@@public
export const pkg: Managed.ManagedNugetPackage = (() => {{
    switch (qualifier.targetFramework) {{
        case ""net45"":
            return Managed.Factory.createNugetPackge(
                ""TestPkg"",
                ""1.999"",
                Contents.all,
                [],
                [],
                [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg]
            );
        case ""net461"":
        case ""net472"":
        case ""net451"":
            return Managed.Factory.createNugetPackge(
                ""TestPkg"",
                ""1.999"",
                Contents.all,
                [],
                [],
                [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg]
            );
        default:
            Contract.fail(""Unsupported target framework"");
    }};
}}
)();", epectedpackageRoot);

            Assert.Equal(expectedSpec, text);
        }