1、原來的方式
在傳統的 .net framework 類型項目下,我們可以通過 nuget 命令行創建 nuspec 描述文件,然后再通過命令行進行打包。如果需要自動打包的話,可以在項目屬性中,找到生成后事件,在里面填寫對應的命令行語句即可。只要寫好對應的命令,以后在生成時就會自動打包發布了。(參考:https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2011/november/nuget-manage-project-libraries-with-nuget)
在新的 .net standard 或 .net core 類型項目下,雖然命令有所更換,但仍然也可以通過以上方式進行自動打包發布。
2、新的問題
但如果在混合目標框架的項目中,有部分內容是不被編譯器支持的。
如不能使用 nuget 編譯打包 .net standard 項目,告知需要使用 dotnet pack 命令,或者路徑重復導致不能正常打包:
Error NU5012: 找不到“bin\Release\projectname\bin\Release\”。請確保已生成項目。
以及 dotnet 命令又對一些項目的引用不支持。
MSB4803: .NET Core 版本的 MSBuild 不支持“ResolveComReference”。請使用 .NET Framework 版本的 MSBuild。有關更多詳細信息,請參閱 https://aka.ms/msbuild/MSB4803。
就造成了無法通過一個命令編譯通過混合目標框架的尷尬情況,也就無法通過第一點提到的方式進行新類型項目的打包發布。
3、解決方法
其實在新的 PackageReference 類型項目中,VS 直接提供了一個選項,在項目屬性的“打包”配置中,可以勾選“在構建時生成 nuget 包”,這個構建不知道為什么,可以做到對兩種目標框架的兼容,可能內部有一些判斷吧,暫時還不清楚。
但是又產生了一個新的問題,這個方式的 nuget 包是在生成后事件執行完成后再打包的,所以原來的腳本(復制到指的位置及發布到指的 nuget 服務)是不能直接在生成后事件中使用的。
通過查找,在這個問題中找到了答案:
並且官方文檔也給出了說明:
https://docs.microsoft.com/zh-cn/nuget/reference/msbuild-targets#target-build-order
但需要手動修改項目文件,將原來的
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Exec Command="nuget.bat" /> </Target>
其中 PostBuildEvent 修改為 Pack,如下:
<Target Name="CopyPackage" AfterTargets="Pack"> <Copy SourceFiles="$(OutputPath)\$(PackageId).$(PackageVersion).nupkg" DestinationFolder="D:\\nuget" /> <Exec Command="nuget.bat" /> </Target>
另外還有了直接可以進行復制的命令【Copy】,將 nupkg 可以不再通過 bat 執行復制到目標路徑
然后依然可以執行命令行或bat,通過發布命令發布到指的的 nuget 服務:
nuget.exe push bin\Release\projectname.*.nupkg apikey -Source http://nugetserver
然后就好了~