如何使用msbuild创建nuget包而无需重建项目?

Sii*_*aas 5 .net msbuild nuget

我想设置一个带有构建,测试和部署阶段的CI/CD管道.我可以在构建阶段构建我的项目

msbuild src\MyProject.csproj /t:Restore 
msbuild src\MyProject.csproj /p:Configuration=Release /p:OutputPath=../BuildOutput
Run Code Online (Sandbox Code Playgroud)

接下来,我将构建并运行..\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
Run Code Online (Sandbox Code Playgroud)

到目前为止它似乎有效.

现在我想生成nuget包.我可以打电话:

msbuild src\MyProject.csproj /t:Pack /p:Configuration=Release /p:OutputPath=../BuildOutput /p:VersionPrefix=1.2.3
Run Code Online (Sandbox Code Playgroud)

这将MyProject.1.2.3.nupkgBuildOutput文件夹中创建.但是它重新构建了该项目.

我正在寻找类似于dotnetcli的东西.

dotnet pack --no-build
Run Code Online (Sandbox Code Playgroud)

但我无法使用,dotnet因为我的项目有一个COM引用.

我也查看了Nuget.exe,但是当我打电话时似乎抛出了一个错误 nuget pack

Unable to cast object of type 'System.String' to type NuGet.Frameworks.NuGet.Frameworks1051960.NuGetFramework'.
Run Code Online (Sandbox Code Playgroud)

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

O. *_*per 5

这取决于您的工作流程中是否可以接受,但您可以在构建项目时使用文件中的<GeneratePackageOnBuild>属性来获取包。如果您的测试未通过,您可以丢弃该文件,但至少没有额外的重建来获取 NuGet 包。<PropertyGroup>.csproj.nupkg

在文章《使用 VS2017 和 Nuget 1轻松支持多个目标框架 (TFM) 》末尾有一个更完整的示例,说明如何使用此设置,但一个非常简单的示例代码片段如下所示:

<PropertyGroup>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

1:虽然原始链接没有报告 404,但它在 2021 年 10 月显示为空白。但是,可以在另一个 URL 上找到同一篇文章。