Nuget是什麼不用多說,你們應該也沒少用過Nuget, 很多人也應該使用過工具打Nuget包,接下來先一步步說明如何使用腳本完成Nuget一鍵打包html
調用以下圖,說明已經配置好
git
nuget spec ConsoleApp1
服務器
生成的nuspec文件以下,其中ConsoleApp1這個Id表示Nuget Package的惟一標識
工具
下圖是我本地文件夾包含的文件
有些文件其實並非咱們想要打進nuget包裏的,這時候咱們能夠編輯Nuspec文件,指定要包含的文件
ui
能夠參考官方文檔
nuspec文件描述:https://docs.microsoft.com/zh-cn/nuget/reference/nuspec
nuget package文件目錄:https://docs.microsoft.com/zh-cn/nuget/create-packages/creating-a-package#from-a-convention-based-working-directory 文中寫明瞭Nuget安裝是對不一樣的文件夾會有不一樣的操做3d
nuget pack ConsoleApp1.nuspec -Version 1.0.0.0
生成對應的package文件 ConsoleApp1.1.0.0.0.nupkg
你們能夠直接將nupkg文件解壓縮,看看裏面具體的文件目錄code
nuget push ConsoleApp1.*.nupkg -Source YourSourceUrl -ApiKey YourApiKey
其中:component
nuget delete ConsoleApp1 1.0.0.0 -Source YourSourceUrl -ApiKey YourApiKey
htm
如今軟件開發離不開代碼版本管理,因此nuget一鍵打包也須要和代碼版本管理結合,這裏以git管理舉例blog
@echo off set AssemblyName=ConsoleApp1 set ApiKey=YourApiKey set SourceUrl=YourSourceUrl echo git tag (須要手動輸入tag版本號以及註釋) set /p version=請輸入版本號(Tag名): set /p comment=請輸入註釋(Tag註釋): echo git tag -a "%version%" -m "%comment%" git tag -a "%version%" -m "%comment%" git push origin "%version%" if %errorlevel% NEQ 0 exit nuget pack %AssemblyName%.nuspec -Version %version% nuget push %AssemblyName%.*.nupkg -Source %SourceUrl% -ApiKey %ApiKey% del %AssemblyName%.*.nupkg /F /Q pause
上述流程介紹了一個比較簡單的打包流程,Nuget Package也是相對簡單,可是每每實際狀況要複雜的多。
如今問題來了,衆所周知,.NET能夠調用C++的dll(實際上.NET的底層都是調用WindowsApi),當你的動態連接庫依賴一個或一組C++的dll的時候怎麼辦?如何讓別人在引用你的動態連接庫的時候,只須要Nuget安裝一下就行?
ContentFiles文件夾在安裝的時候沒有任何行爲
編輯Nuspec文件,在Files節點中指定
能夠自行添加編譯後指令將文件複製到輸出目錄中,以達到使用的目的
可是很顯然,此方法並非很完美,難道每一個引用該package的人都要寫一遍指令來複制文件嗎?
Content文件夾對應的行爲是內容複製到項目根目錄。 將「內容」文件夾視爲最終使用包的目標應用程序的根目錄
用更直白的話語解釋一下:放在content文件夾的內容在安裝的時候,就像你手動在項目中添加文件同樣
同ContentFiles同樣,這裏就再也不贅述
Nuget安裝的時候將Build目錄中的targets文件自動插入到項目中
下圖是個人文件夾目錄
其中components文件夾中包含了一組ConsoleApp1.dll依賴的C++組件
nuspec文件以下圖
targets文件以下
最終打出來的包目錄以下
這種方法只須要使用者直接引用nuget package便可,其餘的均無需考慮,無論是依賴的是一個仍是一組C++組件,無論是在根目錄下仍是包含子目錄,均可以解決上面提到的問題。
實現的原理:nuget在安裝package的時候,將Build目錄中的targets文件直接導入到對應的project文件中,MSBuild執行的時候會將對應的文件輸出到輸出目錄
這裏重點提到一點即是
這個targets文件的名稱必須在當前package的Id同樣(很是重要)本文中都是ConsoleApp1
以上代碼均爲原創分享,若你們認爲有不妥的地方,煩請留言指出,在下感激涕零