NuGet将项目依赖项打包为nuget依赖项

时间:2018-10-15 10:14:58

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

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

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

这是我的设置示例。

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

A 被设置为启动项目,并引用 B C

B 引用了 C

C 没有引用其他两个(仅引用2个第3方nuget)

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

我不确定是什么原因导致了nuget的行为(我想像是设计使然),但是我无法解决这个问题。

我想要的是将项目 B C 作为DLL打包到项目 A 而不是单独的软件包中。

3 个答案:

答案 0 :(得分:1)

  

我不确定是什么原因导致nuget如此行为(我想它是   通过设计),但我无法解决这个问题。

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

检查Controlling dependency assets以获得更多信息。

  

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

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

如果要将项目B和C打包为DLL而不是项目A打包为A,则需要使用.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了解更多详细信息。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您似乎想要生成B和C的DLL,然后将它们复制到A的nuspec文件中引用的A的资源文件夹中。也就是说,您只是打包A,恰好包含B和C的DLL,因此B和C的构建以及向A添加那里的DLL应该分别在 打包之前进行