【问题标题】:NuGet packages project dependencies as nuget dependenciesNuGet 将项目依赖项打包为 nuget 依赖项
【发布时间】:2019-03-19 17:52:35
【问题描述】:

我有 3 个类库项目(所有 .NET Standard 2.0)都在同一个解决方案中。我想将它们打包成一个 nuget 并在其他 repos 中使用代码。

但是,当我将它们打包成 NuGet 包时,其中两个作为 nuget 依赖项添加到第三个,而不是直接作为 dll 引用。

这是我的设置示例。

这 3 个项目 - A.csproj、B.csproj、C.csproj(所有类库、所有 .NET Standard 2.0)

A设置为启动项目,引用BC

B 引用了 C

C 没有引用其他两个(它只引用 2 个 3rd 方 nuget)

当我将解决方案打包到 nuget 包中时,nuspec 文件有一个 <dependencies> 组,其中包含来自我的项目的所有 nuget 引用(正确)以及项目的 2 个依赖项B C 版本为 1.0.0(不正确

我不确定是什么导致 nuget 出现这种行为(我想象它是设计使然),但我无法解决这个问题。

我想要的是将项目 BC 打包为 DLL 以项目 A 而不是单独的包。

【问题讨论】:

    标签: c# reference visual-studio-2017 dependencies nuget


    【解决方案1】:

    您必须手动/或通过一些前/后构建命令/脚本更新.nuspec 中的依赖项版本。如果您需要为很多项目执行此操作,那么我建议您编写一个脚本并在构建前/构建后运行。

    .nuspec 无法检测依赖项本身的版本。

    【讨论】:

    • 问题是,我不希望软件包首先有版本。我不想要那里的包裹。我希望将它们作为对原始文件的 dll 引用包含在内,然后保留
    【解决方案2】:

    我不确定是什么导致 nuget 表现得像这样(我想它 按设计),但我无法解决这个问题。

    是的,这种行为是设计使然。当我们打包.net core/.NET Standard时,PrivateAssets元数据标签控制依赖资产是否流向父项目。如果该值设置为All,则此依赖项资产将不会流向父项目。换句话说,项目 B 和 C 不会作为依赖项添加到包中。

    查看Controlling dependency assets了解更多信息。

    我想要的是将项目 B 和 C 打包为项目 A 的 DLL,而不是单独的包。

    就像我在第一个问题中所说的那样,我们可以使用PrivateAssets 元数据标签来控制依赖资产是否流向父项目,但是PrivateAssets 元数据标签不会将项目 B 和 C 打包为项目 A DLL。

    如果您希望将项目 B 和 C 打包为项目 A 的 DLL,而不是作为单独的包,我们需要使用 .nuspec 文件手动包含它们。

    .nuspec 点赞:

    <?xml version="1.0"?>
    <package >
      <metadata>
        <id>TestDemo</id>
        <version>1.0.0</version>
        <authors>Tester</authors>
        <owners>Tester</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>TestDemo</description>
        <releaseNotes>Summary of changes made in this release of the package.    </releaseNotes>
        <copyright>Copyright 2017</copyright>
        <tags>Tag1 Tag2</tags>
      </metadata>
      <files>
        <file src="bin\debug\projectA.dll" target="lib\.netstand2.0" />
        <file src="<Path>\projectB.dll" target="lib\.netstand2.0" />
        <file src="<Path>\projectC.dll" target="lib\.netstand2.0" />
      </files>
    </package>
    

    查看this thread了解更多详情。

    【讨论】:

      【解决方案3】:

      看起来您想为 B 和 C 生成 DLL,然后将它们复制到 A 的资源文件夹中,该文件夹在 A 的 nuspec 文件中引用。也就是说,您只是打包 A,其中恰好包含 B 和 C 的 DLL,因此 B 和 C 的构建以及将 DLL 添加到 A 应该单独发生打包 A .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        相关资源
        最近更新 更多