Nuget一鍵打包上傳以及高階應用

hexuwsbg發表於2020-05-16

Nuget是什麼不用多說,大家應該也沒少用過Nuget, 不少人也應該使用過工具打Nuget包,接下來先一步步說明如何使用指令碼完成Nuget一鍵打包

Nuget一鍵打包

配置Nuget環境

呼叫如下圖,說明已經配置好

生成Nuget包必須包含的Nuspec檔案

nuget spec ConsoleApp1

生成的nuspec檔案如下,其中ConsoleApp1這個Id表示Nuget Package的唯一標識

下圖是我本地資料夾包含的檔案

有些檔案其實並不是我們想要打進nuget包裡的,這時候我們可以編輯Nuspec檔案,指定要包含的檔案

可以參考官方文件
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安裝是對不同的資料夾會有不同的操作

Nuget生成package

nuget pack ConsoleApp1.nuspec -Version 1.0.0.0
生成對應的package檔案 ConsoleApp1.1.0.0.0.nupkg
大家可以直接將nupkg檔案解壓縮,看看裡面具體的檔案目錄

Nuget上傳

nuget push ConsoleApp1.*.nupkg -Source YourSourceUrl -ApiKey YourApiKey
其中:

  • YourSourceUrl 指nuget伺服器地址
  • YourApiKey 指通過伺服器校驗的金鑰

Nuget包刪除

nuget delete ConsoleApp1 1.0.0.0 -Source YourSourceUrl -ApiKey YourApiKey

完整的Nuget一鍵打包流程

現在軟體開發離不開程式碼版本管理,所以nuget一鍵打包也需要和程式碼版本管理結合,這裡以git管理舉例

@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安裝一下就行?

方法一:使用Nuget Package中的ContentFiles資料夾

ContentFiles資料夾在安裝的時候沒有任何行為

如何放入ContentFiles資料夾中

編輯Nuspec檔案,在Files節點中指定

如何將ContentFiles中的檔案輸出到編譯輸出目錄呢

可以自行新增編譯後指令將檔案複製到輸出目錄中,以達到使用的目的
但是很顯然,此方法並不是很完美,難道每個引用該package的人都要寫一遍指令來複制檔案嗎?

方法二:使用Nuget Package中的Content資料夾

Content資料夾對應的行為是內容複製到專案根目錄。 將“內容”資料夾視為最終使用包的目標應用程式的根目錄
用更直白的話語解釋一下:放在content資料夾的內容在安裝的時候,就像你手動在專案中新增檔案一樣

如何放入Content資料夾

同ContentFiles一樣,這裡就不再贅述

如何將Content中的檔案輸出到編譯輸出目錄呢

  • 同ContentFiles一樣寫指令複製檔案
  • 因Content的檔案會被引入到專案中,可以設定檔案的屬性,修改輸出的行為,但是每次已更新就得重新設定
    這種方法也不是很完美

方法三:使用Nuget Package中的Build資料夾+自定義的Targets檔案

Nuget安裝的時候將Build目錄中的targets檔案自動插入到專案中

如何放入Build資料夾中

下圖是我的資料夾目錄

其中components資料夾中包含了一組ConsoleApp1.dll依賴的C++元件

nuspec檔案如下圖

targets檔案如下

最終打出來的包目錄如下

這種方法只需要使用者直接引用nuget package即可,其他的均無需考慮,不管是依賴的是一個還是一組C++元件,不管是在根目錄下還是包含子目錄,都可以解決上面提到的問題。
實現的原理:nuget在安裝package的時候,將Build目錄中的targets檔案直接匯入到對應的project檔案中,MSBuild執行的時候會將對應的檔案輸出到輸出目錄
這裡重點提到一點便是
這個targets檔案的名稱必須在當前package的Id一樣(非常重要)本文中都是ConsoleApp1

以上程式碼均為原創分享,若大家認為有不妥的地方,煩請留言指出,在下感激不盡

本文作者:hexuwsbg

出處:https://www.cnblogs.com/hexu0512/p/12880526.html

版權:本文采用「可附帶出處轉載」知識共享許可協議進行許可

相關文章