在构建时将项目引用更改为NuGet包引用

问题描述 投票:0回答:3

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

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

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

还有其他人有这个问题可以给我一些如何解决它的指导吗?到目前为止,我已经在网上看了一眼,并留了一个空白。

谢谢!

.net azure-devops nuget azure-pipelines
3个回答
2
投票

我的回答分为两部分。

首先,如果你使用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有依赖性。这与SDK样式项目“开箱即用”,但如果你有一个“旧样式”项目(导入Microsoft.CSharp.targets),你需要添加一个包引用到NuGet.Build.Tasks.Pack 。如果使用PackageReference,则可能需要编辑csproj并设置此依赖项以将PrivateAssets设置为all以避免此包成为nuget依赖项。如果您正在使用packages.config,或者甚至可能,我不知道等效的是什么。如果您使用的是msbuild或dotnet pack,但您也拥有自己的nuspec文件,我建议不要使用它。通过在csproj中设置正确的属性或项属性,可以在nuspec中执行任何操作,并让包目标自动生成nuspec。当你拥有自己的nuspec时,nuget的自动生成部分会被关闭,所以你可能会让自己变得更难。

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

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


0
投票

在构建时将项目引用更改为NuGet包引用

我担心在构建期间您无法将项目引用转换为nuget包引用。那是因为它们是处理引用的两种不同方式。虽然现在有一些扩展可以将项目引用转换为nuget包引用,但它们需要手动操作,我们无法在构建期间使用它。

查看.NET Standard (2.0) library了解更多详情。

因此,我们无法将项目引用nuget update更改为NuGet包引用,并在构建时添加到.NET Framework(UI)库。

就个人而言,要解决此问题,您可以使用.net标准(.netSrd)项目作为本地的nuget包引用,当您更新.net标准项目的版本号nuget包时,您可以在Azure中更新此包工件,并使用自定义nuget任务命令调用Update NuGet package to last version after build in VSTS命令,以便在构建.NET Framework(UI)库时将软件包更新到最新版本。

查看详细信息:

for PackageReferences

希望这可以帮助。


0
投票

当不使用.net Core文件时,NuGet CLI存在依赖关系.nuspec和项目引用的问题(仅当项目是dotnet pack或.net标准时?)。

使用msbuild -t:pack<PackageReference Include="NuGet.Build.Tasks.Pack"> <PrivateAssets>all</PrivateAssets> <Version>4.8.0</Version> </PackageReference> 将项目引用包含为nuget依赖项。这也解决了PackageReferences未被编写为依赖项的问题。

假设您的.net框架项目是Visual Studio开箱即用的,您需要引用Nuget.Build.Tasks.Pack nuget包来访问必要的目标。在任何nuget恢复之前,我们在构建服务器上使用powershell将这些数据写入.csproj文件中,这样就不会忘记新的完整框架项目(我们试图摆脱创建)。正如@zivkan所提到的,你可能会想要

将PrivateAssets设置为all以避免此包成为nuget依赖项

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.