Ste*_*Day 7 .net nuget azure-devops azure-pipelines
我有一个包含两个项目的 Visual Studio 解决方案 - 一个包含一些逻辑的 .NET Standard (2.0) 库和一个包含用户界面等的 .NET Framework (4.6.1) 类库。 .NET Framework 库然后有 .NET Standard 库添加为项目参考,以便它可以使用逻辑库中包含的方法。
然后我在 Azure DevOps 中使用 Azure Pipelines 来构建这两个项目,将它们打包为 NuGet 包并将它们推送到 Azure DevOps(Azure Artifacts)提供的 NuGet 服务器。
但是,发布 NuGet 包时,它们仅包含 NuGet 中对我通过 NuGet 添加到项目的包的依赖项。理想情况下,我想要的是当我的 .NET Standard(逻辑)库打包并推送到 NuGet 服务器时,NuGet 上对它的引用(带有更新的版本号等)被添加到我的 .NET Framework (UI) 库中。
有没有其他人遇到过这个问题,可以给我一些有关如何解决它的指导吗?到目前为止,我已经在网上查看并绘制了一张空白。
谢谢!
我的回答有两个部分。
首先,如果您使用dotnet packor msbuild -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
Run Code Online (Sandbox Code Playgroud)
ProjectB.1.0.0.nupkg 有 nuget 依赖 ProjectA 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 的一部分'
我nuget pack对旧式 csproj 文件的记忆是只要引用的项目在与<project name>.nuspec文件相同的目录中有一个文件,nuget 就会自动使项目引用成为 nuget 依赖项<project name>.csproj(我几乎可以肯定它记录在 docs.microsoft 的某处.com/nuget)。但是,如果您的依赖项目是 SDK 样式项目(例如 .NET Core 或 .NET Standard 项目需要),那么我已经建议不要在这些项目中使用 nuspec 文件,因此您应该真正考虑使用包目标并停止使用nuget pack.
我的回答的第二部分将直接回答您的问题,即如何在某些构建上使项目引用成为包引用。首先,您需要使用包目标,通过使用 SDK 样式项目或通过引用 NuGet.Build.Tasks.Pack 包。这样,您不使用nuspec文件,所有内容都在您的csproj. MSBuild 有条件,所以手动编辑你的 csproj 并使你的项目引用有一定的条件,而包引用有相反的条件。我建议使用像 $(CI) 这样的变量,这样你就可以使用msbuild -t:pack -p:CI=true,并在您的 CI 机器上将 CI 作为环境变量设置为 true。由于 NuGet 已经内置了将项目引用转换为 nuget 依赖项的功能,因此我建议使用它,而不是在包和项目引用之间切换,因此我不打算提供有关如何执行此操作的复制粘贴示例。但是,如果这不是XY 问题的情况并且您确实需要这样做,那么我已经为您提供了足够的指示,让您能够弄清楚如何完成其余的工作。
不使用文件时, NuGet CLI 存在PackageReferences 和项目引用的依赖关系问题(仅当项目也是.net Core.nuspec或 .net Standard 时?) 。
使用dotnet pack或msbuild -t:pack将项目引用包含为 nuget 依赖项。这也解决了 PackageReferences 未编写为依赖项的问题。
假设您的 .net 框架项目是 Visual Studio 开箱即用的,您需要引用Nuget.Build.Tasks.Pack nuget 包来访问必要的目标。在进行任何 nuget 恢复之前,我们会在构建服务器上使用 powershell 将这些数据写入 .csproj 文件,这样对于新的完整框架项目(我们试图避免创建该项目)就不会忘记这一点。正如 @zivkan 提到的,你可能想要
将 PrivateAssets 设置为 all 以避免此包成为 nuget 依赖项
<PackageReference Include="NuGet.Build.Tasks.Pack">
<PrivateAssets>all</PrivateAssets>
<Version>4.8.0</Version>
</PackageReference>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7042 次 |
| 最近记录: |