Dot-Net

如何在不重建項目的情況下使用 msbuild 創建 nuget 包?

  • October 28, 2021

我想設置一個包含建構、測試和部署階段的 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

這將MyProject.1.2.3.nupkgBuildOutput文件夾中創建。但是,它會重新建構該項目。

我正在尋找類似於dotnetcli的東西。

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 是否有可以跳過建構的屬性?

這取決於您的工作流程是否可以接受,但您可以在建構項目時使用文件中的屬性<GeneratePackageOnBuild>來獲取包。如果您的測試沒有通過,您可以丟棄該文件,但至少沒有額外的重建來獲取 NuGet 包。<PropertyGroup>``.csproj``.nupkg

在文章的末尾有一個更完整的範例,說明如何使用此設置輕鬆支持 VS2017 和 Nuget 1的多個目標框架 (TFM) ,但範例性非常簡單的程式碼段如下所示:

<PropertyGroup>
   <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
</PropertyGroup>

1:雖然原始連結未報告 404,但在 2021 年 10 月顯示為空白。但是,可以在另一個 URL上找到同一篇文章。

引用自:https://stackoverflow.com/questions/46974163