Nuget 多平臺多目標快速自動打包

構建現代的 .Net 應用離不開 Nuget 的支持,而快速打包 Nuget 成了提高生產率的有效方法。

1. 前置條件

爲了實現 Nuget 的快速打包,我們需要先解決一些前置依賴,無論是 .Net Framework、Mono 或者 .Net Standard(.Net Core),我們都需要先編譯通過,然後再打包成 Nuget 包,最後再發布到 Nuget 服務器上。

相關目標 (支持平臺以及依賴):

  • .Net Framework (僅 Windows) : MSBuild.exe、Nuget.exe
  • Mono (跨平臺) : mono、xbuild、Nuget.exe
  • .Net Standard (跨平臺) : dotnet sdk

由於大多數人還是在 Windows 上開發,所以我下面的教程會以 Windows 爲標準,並旁敲側推到其他平臺。

2. 快速打包示例

2.1 Visual Studio 中快速打包

在 Visual Studio 中要實現 Nuget 的快速打包主要是藉助 Visual Studio 自帶的外部工具。在實戰之前,我們要確保依賴都滿足了。因爲已經安裝了 Visual Studio ,所以默認是已經安裝了 MSBuild 和 Nuget 了。

其次,爲了讓自動打包的腳本的字符串儘量節省空間,我們會盡量將對應的依賴加到系統環境變量的 Path 路徑中。一般而言,Msbuild 是在 Visual Studio 安裝目錄下的 Msbuild 目錄中,如下圖所示,在我本機地址是 "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\amd64" ,Nuget 最好是另外放置,例如我就把它放到了 "D:\tools" 目錄中。

系統環境變量

如果你足夠細心,可以發現安裝完 .Net Core 的 SDK 後,默認已經加到了系統的環境變量中了( Mono 也是如此)。

然後我們使用 Visual Studio 打開對應的項目,點擊菜單欄中 " 工具 - 外部工具 ",添加我們自定義的自動打包發佈腳本。

外部工具

如上圖所示,這裏使用的是 powershell.exe,如果提示找不到 powershell.exe,同樣是將路徑添加到系統環境變量的 path 中。至於參數,可以是一個ps腳本文件,也可以是執行腳本語句,在這裏使用腳本語句。初始目錄選中 "目標目錄" 或者 "項目目錄"都可以。

從上圖中,可以看出區分了目標構建,這裏分佈展示 .Net Framework 和 .Net Standard 的構建腳本,其中 .Net Framework 類似這樣:

del *.nupkg ; $roj=dir *.csproj ;msbuild $roj; nuget pack $roj ; $nupkg= dir *.nupkg; nuget.exe push $nupkg nugetpassword -Source http://192.168.9.1/nuget

而 .Net Standard 則是:

del *.nupkg ; dotnet build ;dotnet pack --output  $pwd;$nupkg= dir *.nupkg; dotnet nuget push  $nupkg nugetpassword -Source http://192.168.9.1/nuget

至於運行在非 Windows 上的 Mono 則可能是:

rm *.nupkg ; $roj= *.csproj ;xbuild $roj; $ver= date -d yesterday +%Y%m%d%H%M;nuget pack $roj -Suffix $ver; $nupkg=  *.nupkg; mono nuget.exe push $nupkg nugetpassword -Source http://192.168.9.1/nuget

他們共同的特徵都是先刪除當前路徑的 nupkg 的文件,然後編譯、打包、發佈。(如果你沒有私有的Nuget服務器,可以參考我另外一篇文章)

在這個基礎上可以做更多的擴展,比如發佈測試版本,就在原來的基礎上添加後綴,如:

del *.nupkg ; $roj=dir *.csproj ;msbuild $roj; $ver=\"beta-\"+(Get-Date).ToString(\"yyyyMMddHHmm\");nuget pack $roj -Suffix $ver; $nupkg= dir *.nupkg; nuget.exe push  $nupkg nugetpassword -Source http://192.168.9.1/nuget

編寫好自定義的外部工具後,以後每次打包發包都可以按一下按鈕就運行了。

2.2 VSCode

VSCode 是另外一個受人歡迎的代碼編輯器,目前不支持 Visual Studio 中的外部工具功能 (如果有,請告訴我),也沒有擴展支持直接發佈 Nuget 包,但是這並不妨礙我們實現快速自動打包併發布 Nuget 包。

VSCode 中一個有力的功能就是任務功能,我們可以通過執行任務來實現同樣的效果。
task.json

2.3 文件夾右鍵菜單

2.3.1 Windows 環境中示例

有時候我們可能需要脫離 ide 來執行腳本,這個時候文件夾右鍵菜單就顯得十分高效了(可以多選文件夾發佈)。

文件夾右鍵菜單

具體的操作是修改 windows 的註冊表,具體可以參考windows 下如何修改右鍵菜單 一文。

修改註冊表

如果你覺得麻煩,我這裏有一個示範的註冊表,修改其中Nuget push的參數爲對應的Nuget服務器信息,另存爲 nuget.push.reg,雙擊即可導入到系統,然後重啓 windows 資源管理器的進程(就是我的電腦的進程)。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\Nuget]
@="Nuget發佈"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\Nuget\command]
@="powershell.exe -noexit -command Set-Location '%V' ;powershell.exe  -c \"echo $pwd;del *.nupkg ;dotnet pack --output  $pwd;$nupkg= dir *.nupkg; dotnet nuget push $nupkg -k 123456 -s http://192.168.1.1;\""

如果提示找不到程序,需要把 powershell.exe 添加到系統環境變量的path中。

2.3.2 Mac 環境中示例

在 Mac 中實現同樣的功能需要藉助 Automator 的幫助,首先是添加一個服務,選擇運行shell腳本,保存的時候取一個友好的名字。

Automator

文件夾效果

3. 結語

雖然本文着重講了如何實現 Nuget 多平臺多目標快速自動打包的小目標,但從幾個示例當中就可以看到自動化腳本的威力。

我的博客即將入駐“雲棲社區”,誠邀技術同仁一同入駐。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章