如何在不重新构建项目的情况下使用MSBuild创建NuGet包?

8

我希望设置一个包含构建、测试和部署阶段的 CI/CD 流水线。 在构建阶段可以使用以下方式构建项目:

msbuild src\MyProject.csproj /t:Restore 
msbuild src\MyProject.csproj /p:Configuration=Release /p:OutputPath=../BuildOutput

接下来,我将构建并运行针对已经构建的 ..\BuildOutput\MyProject.dll 的测试。

msbuild tests\MyProject.Tests.csproj /t:Restore
msbuild tests\MyProject.Tests.csproj /p:Configuration=Release /p:OutputPath=../BuildOutput /p:BuildProjectReferences=false
vstest.console BuildOutput\MyProject.Tests.dll

到目前为止,它似乎可以工作。

现在我想生成NuGet包。 我可以调用:

msbuild src\MyProject.csproj /t:Pack /p:Configuration=Release /p:OutputPath=../BuildOutput /p:VersionPrefix=1.2.3

这将在 BuildOutput 文件夹中创建 MyProject.1.2.3.nupkg。 但是它会重新构建该项目。

我正在寻找类似于 dotnet 命令行界面的东西。

dotnet pack --no-build

但是我不能使用dotnet,因为我的项目有一个COM引用。

我也研究了Nuget.exe,但是当我调用nuget pack时它似乎会抛出一个错误。

Unable to cast object of type 'System.String' to type NuGet.Frameworks.NuGet.Frameworks1051960.NuGetFramework'.

msbuild有没有可以跳过构建的属性?


这是较新的,但我更偏向于这里所涵盖的内容:https://stackoverflow.com/a/53568518/3543437 - kayleeFrye_onDeck
1个回答

5
这取决于您的工作流程是否接受,但您可以在 .csproj 文件的 <PropertyGroup> 中使用 <GeneratePackageOnBuild> 属性,在构建项目时获取包。如果您的测试未通过,则可以丢弃 .nupkg 文件,但至少不需要重新构建以获取 NuGet 包。
文章Easily supporting multiple target frameworks (TFMs) with VS2017 and Nuget1的结尾有一个更完整的示例,但是一个简单的示例代码如下:
<PropertyGroup>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
</PropertyGroup>

1: 原链接虽未报告 404 错误,但在2021年10月却呈现为空白。然而,同一篇文章可以在另一个网址找到。


那个流程也在我的脑海中浮现了。因此,在构建阶段,我会构建我的项目并创建那个包。如果是部署的时候,我只需发送在构建阶段生成的包即可。虽然总是在构建阶段创建包感觉有点多余,但我仍然更喜欢可用的流水线而不是没有任何流水线 :)。 - Siim Haas
或者,如果您想在构建时专门定义此内容(例如作为CI配置的一部分),而不是将其硬编码到项目文件中,则可以使用/t:build,pack开关。这与仅使用/t:pack不同,它将确保任何不打算进行打包的项目仍然会被构建,就像有一个单独的/t:build任务一样。 - Jeremy Caney
@O.R. Mapper,您能告诉我GeneratePackageOnBuild在哪个props或targets文件中定义的吗? - Legends
“这篇文章”的链接已经失效。” - pvoosten
@pvoosten:感谢您指出这一点-我想我已经找到了第二篇文章的来源,并将其添加到答案中。 - O. R. Mapper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接