我有一个带有两个项目的Visual Studio解决方案-一个包含一些逻辑的.NET Standard(2.0)库和一个包含用户界面等的.NET Framework(4.6.1)类库。然后.NET Framework库具有.NET Standard库作为项目引用添加,因此它可以使用逻辑库中包含的方法。

然后,我在Azure DevOps中使用Azure Pipelines来构建这两个项目,将它们打包为NuGet程序包,然后将它们推送到Azure Devops提供的NuGet服务器(Azure Artifacts)。

但是,发布NuGet程序包时,它们仅包含在NuGet中对我已通过NuGet添加到项目中的程序包的依赖关系。我理想的情况是将.NET标准(逻辑)库打包并推送到NuGet服务器时,将对NuGet的引用(具有更新的版本号等)添加到我的.NET Framework(UI)库中。

有没有其他人遇到过这个问题,请给我一些如何解决的指导?我在网上看过一眼,至今为止还是一片空白。

谢谢!

最佳答案

我的回答分为两部分。

首先,如果您使用的是dotnet packmsbuild -t:pack,而没有nuspec文件,那么项目引用会自动成为nuget依赖项。我使用以下命令验证了这一点:

dotnet new classlib -n ProjectA
dotnet new classlib -n ProjectB
dotnet add ProjectB/ProjectB.csproj reference ProjectA/ProjectA.csproj
dotnet pack ProjectB/ProjectB.csproj
ProjectB.1.0.0.nupkgProjectA v1.0.0具有nuget依赖性。这对于SDK样式的项目可以“开箱即用”,但是,如果您有一个“旧样式”项目(导入Microsoft.CSharp.targets),则需要添加对NuGet.Build.Tasks.Pack的程序包引用。如果使用PackageReference,则可能需要编辑csproj并设置此依赖项以将PrivateAssets设置为all,以避免此程序包成为nuget依赖项。我不知道如果您正在使用packages.config,或者甚至可以做到的话。如果您使用的是msbuild或dotnet pack,但您也有自己的nuspec文件,建议不要使用它。您可以通过在csproj中设置正确的属性或项属性来执行nuspec中的任何操作,并让pack目标自动生成nuspec。当您拥有自己的nuspec时,nuget自动生成的部分功能会关闭,因此您可能会变得更难为自己。

我在旧式csproj文件中对nuget pack的内存是,只要引用的项目与<project name>.nuspec文件位于同一目录中,nuget就会自动使项目引用为nuget依赖项(我几乎可以肯定它记录在某个位置) docs.microsoft.com/nuget)。但是,如果您的从属项目是SDK样式的项目(例如.NET Core或.NET Standard项目所需的项目),那么我已经建议不要在这些项目中使用nuspec文件,因此您应该真正考虑使用pack目标并停止使用<project name>.csproj

我的答案的第二部分将直接回答您的问题,即有关如何使项目引用某些构建中的程序包引用。首先,您需要通过使用SDK样式项目或通过引用NuGet.Build.Tasks.Pack包来使用包目标。这样,您就不会使用nuget pack文件,并且所有内容都在nuspec中定义,它只是一个MSBuild文件。 MSBuild具有条件,因此请手动编辑csproj并使项目引用具有特定条件,并使程序包引用具有相反的条件。我建议使用$(CI)之类的变量,以便您可以使用csproj测试该包,并且在您的CI机器上,只需将CI作为环境变量设置为true即可。由于NuGet已经内置了将项目引用转换为nuget依赖项的内置功能,因此我建议使用该功能,而不是在程序包引用和项目引用之间切换,因此,我不打算提供复制粘贴示例来说明如何执行此操作。但是,如果这不是XY-problem的情况,而您确实需要执行此操作,那么我已经为您提供了足够的指针,使您能够弄清楚如何进行其余操作。

关于.net - 在构建时将项目引用更改为NuGet包引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54871290/

10-12 00:01
查看更多