我有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 而不是单独的软件包中。
答案 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应该分别在 打包之前进行