對於那些不打算涉及這么復雜而又想制作自己的 nuget 包的園友們,我是推薦使用 Nuget Package Explorer 來制作的。關於這個圖形化的 nuget 包管理軟件的使用,博客園內有相關的文章,大家可以搜索看看。
好,回歸正題。但是我們都知道,圖形化最大的問題就是自動化不高。
這是我其中的一個 nuget 包,可以看見里面的文件還是比較多的,那么我每一次重新編譯,需要發布新版本的時候,就得把里面大部分的文件都替換成新的文件。每次都一個一個的替換,煩啊。而且有時候還得擔心有沒有替換少了。那么自動化打包肯定是值得研究研究一番了。
在 nuget 官網上面我們可以找到一篇關於如何創建 nuget 包的教程:https://docs.nuget.org/Create/Creating-and-Publishing-a-Package。
那么我們先下載這個命令行工具下來。
然后准備我們需要打包的文件(就是 dll 之類的東西)。
看了下文檔,說是支持讀取直接 csproj 文件打包,那我們先試一下吧,畢竟程序員的准則就是能簡單就簡單,能懶就懶。
這里我的項目結構是這樣的:
然后我們運行 cmd 並輸入命令
報了個錯,重新生成一下項目吧,再次運行。
好像成了,看看目錄。
但是這 dll 所屬的分類,錯了吧,我建的可是 Win10 應用程序的 dll。。。
既然 csproj 方案不行的話,我們繼續看文檔。看見有一個通過描述 nuget 包的方案:https://docs.nuget.org/Create/Creating-and-Publishing-a-Package#create-the-manifest
要建立這么一個描述文件也很簡單,跑個命令
然后我們用文本編輯器來打開這個新的 Package.nuspec 文件。
可以看見是一個 xml 文件,然后修改下里面的屬性就可以了。
再次執行。
有警告,簡單看了下,是說不知道應該打包哪些文件。
那么繼續找找文檔,最后我們可以發現這個。
修改下我們的 nuspec 文件。
新加上紅色部分,也就是將這個 dll 打包進 nuget 包的 lib\uap10.0\ 這個目錄里面。
再次執行打包命令。
這次沒警告了。
而且包的結構也沒問題。
那么只要編寫好 nuspec 里面的 files 節點的話,以后執行 nuget pack XX.nuspec 這個命令的話,就能夠簡單地生成 nuget 包了。
為了再懶一點,我們將上面這個命令弄成批處理。
%~dp0nuget.exe pack %~dp0Package.nuspec -OutputDirectory %~dp0
%~dp0 這個是獲取當前正在執行的這個 bat 文件的所在目錄。
那么最后就變成這樣:
確保這三個文件放在一起,然后執行 package.bat 就能在當前目錄生成 nuget 包了。
接下來我們就可以發布 nuget 包了,用命令也行,但保障一點,我還是用 GUI 工具來發布(畢竟發布前再檢查一次還是有必要的)。
用 Nuget Package Explorer 打開上面生成的那個 nuget 包。
按這里就可以了。
注意:一旦發布,nuget 上的包是不能夠刪除的!!只能隱藏,因此,請確保無誤再發布。
這里是分割線
:
到最后一步我們已經使用批處理來做了,那么可以再玩的花樣就多去了,例如用 PowerShell 來自動化包的版本。在項目的 AssemblyInfo.cs 有一個 AssemblyVersion 的 Attribute,然后我們就可以用 PowerShell 來先讀取這個版本號,然后修改 nuspec 文件里的 version 節點,再生成包。其實我現在就已經是這么做了,鑒於我 PowerShell 也沒學過,那段代碼就不放出來丟臉了
。大家可以發散思維,期望在 nuget 上能看見園友發布的包包
。