以往做nuget包我們一般要麼用命令行,要麼用nuget的圖形化界面去做,但是一些操作比較麻煩.比如引入命名空間,引入第三方nuget包。這些在.NET Core項目里卻很簡單,只需要使用命令行dotnet pack,在.NET Core系列 : 1、.NET Core 環境搭建和命令行CLI入門 ...
NuGet是個開源項目,項目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等項目,.NET Core項目完全使用Nuget 管理組件之間的依賴關係,Nuget已經成為.NET 生態系統中不可或缺的一個組件,從項目角度,將項目中各種組件的引用統統交給NuGet,添加組件/刪除組件/以及更新組件即可一鍵完成,大大提升工作效率,減少不必要的引用報錯。從運維角度,可在不影響老版本的情況下發佈新版本,可統一管理公司各個項目中組件版本不一和各個版本組件的使用情況,減少故障發生以並使得項目穩定運行。
以往做nuget包我們一般要麼用命令行,要麼用nuget的圖形化界面去做,但是一些操作比較麻煩.比如引入命名空間,引入第三方nuget包。這些在.NET Core項目里卻很簡單,只需要使用命令行dotnet pack,在.NET Core系列 : 1、.NET Core 環境搭建和命令行CLI入門 做了簡要介紹,下麵我們來詳細介紹下這個命令。
dotnet-pack
- 將代碼打包成 NuGet 包
概要
dotnet pack [--output] [--no-build] [--build-base-path] [--configuration] [--version-suffix] [<project>]
描述
dotnet pack
命令生成項目並創建 NuGet 包。這個操作的結果是兩個 nupkg
擴展名的包。一個包含代碼,另一個包含調試符號。
該項目被依賴的 NuGet 包裝被添加到 nuspec 文件,因此,他們能夠在安裝包時得到解決。
預設情況下,項目到項目之間的引用是不打包到項目中的。如果你想那樣做,你需要在你的依賴中引用需要項目的 type
節點設置為 “build” ,設置就像下麵的例子:
{
"version": "1.0.0-*",
"dependencies": {
"ProjectA": {
"target": "project",
"type": "build"
}
}
}
預設情況下,dotnet pack
首先生成項目。如果你想避免這樣,傳遞 --no-build
選項。這在持續集成(CI)構建場景,正如你所知道代碼僅僅是預生成的示例,是很有用的。
選項
[project]
打包的項目。它還可以是一個 project.json
文件的路徑或者是目錄。如果忽略,它將預設為當前目錄。
-o
, --output
[DIR]
指定生成的目錄。
--no-build
打包進程中跳過生成階段。
--build-base-path
指定臨時生成產物的目錄。預設情況下,它們在當前目錄的 obj 目錄。
-c
, --configuration [Debug|Release]
當生成項目時使用的配置。如果沒有指定,將預設為 “Debug”。
例子
dotnet pack
打包當前項目。
dotnet pack ~/projects/app1/project.json
打包 app1 項目。
dotnet pack --output nupkgs
打包當前的應用程式,並將生成的包放置到指定的文件夾中。
dotnet pack --no-build --output nupkgs
打包當前的項目到指定的文件夾中,並跳過生成步驟
回到我們在.NET Core系列 :3 、使用多個項目 創建的類庫項目DotnetNewLib,切換到DotnetNewLib 目錄下執行 dotnet pack命令:
[root@Mono DotnetNewLib]# dotnet pack
Project DotnetNewLib (.NETStandard,Version=v1.6) was previously compiled. Skipping compilation.
Producing nuget package "DotnetNewLib.1.0.0" for DotnetNewLib
DotnetNewLib -> /root/DotnetNewLib/bin/Debug/DotnetNewLib.1.0.0.nupkg
Producing nuget package "DotnetNewLib.1.0.0.symbols" for DotnetNewLib
DotnetNewLib -> /root/DotnetNewLib/bin/Debug/DotnetNewLib.1.0.0.symbols.nupkg
目錄結構如下:
DotnetNewLib
|-- Library.cs
|-- project.json
|-- project.lock.json
+—bin
+—Debug
|-- DotnetNewLib.1.0.0.nupkg
|-- DotnetNewLib.1.0.0.symbols.nupkg
+-- netstandard1.6
|-- DotnetNewLib.deps.json
|-- DotnetNewLib.dll
+-- DotnetNewLib.pdb
上面的結構里我把obj目錄拿掉了,我們看到在Debug目錄下生成了2個文件DotnetNewLib.1.0.0.nupkg 和DotnetNewLib.1.0.0.symbols.nupkg, 這些就是nuget 包,很簡單吧,版本號信息來自於project.json文件:
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable"
},
"dependencies": {},
"frameworks": {
"netstandard1.6": {
"dependencies": {
"NETStandard.Library": "1.6.0"
}
}
}
}
但是我生成的是Debug,我們生成Release 版本:
dotnet pack -c Release
[root@Mono DotnetNewLib]# dotnet pack -c Release
Project DotnetNewLib (.NETStandard,Version=v1.6) will be compiled because expected outputs are missing
Compiling DotnetNewLib for .NETStandard,Version=v1.6
Compilation succeeded.
0 Warning(s)
0 Error(s)
Time elapsed 00:00:03.4976986
Producing nuget package "DotnetNewLib.1.0.0" for DotnetNewLib
DotnetNewLib -> /root/DotnetNewLib/bin/Release/DotnetNewLib.1.0.0.nupkg
Producing nuget package "DotnetNewLib.1.0.0.symbols" for DotnetNewLib
DotnetNewLib -> /root/DotnetNewLib/bin/Release/DotnetNewLib.1.0.0.symbols.nupkg
生成了Release目錄
DotnetNewLib
|-- Library.cs
|-- project.json
|-- project.lock.json
+—bin
+—Debug
|-- DotnetNewLib.1.0.0.nupkg
|-- DotnetNewLib.1.0.0.symbols.nupkg
+-- netstandard1.6
|-- DotnetNewLib.deps.json
|-- DotnetNewLib.dll
+-- DotnetNewLib.pdb
+—Release
|-- DotnetNewLib.1.0.0.nupkg
|-- DotnetNewLib.1.0.0.symbols.nupkg
+-- netstandard1.6
|-- DotnetNewLib.deps.json
|-- DotnetNewLib.dll
+-- DotnetNewLib.pdb
在Release目錄下 生成了2個文件DotnetNewLib.1.0.0.nupkg 和DotnetNewLib.1.0.0.symbols.nupkg,第一個文件就是我們想要的nuget包。我們來看下Nuget 包里的具體內容,我們可以用
NuGet Package Explorer 工具打開DotnetNewLib.1.0.0.nupkg:
裡面僅有一個 lib 文件 netstandard1.6 目標配置文件。這意味著,我們 NuGet 包只適用於.Net Core 應用程式 針對 NetStandard1.6 (和即將到來的 4.6.3),文章 擁抱.NET Core,如何開發一個跨平臺類庫 (1)
對Nuget包做了很好的說明瞭,推薦大家閱讀, 園子里還有一篇《用命令行工具創建 NuGet 程式包》對Nuget 的詳細內容做了講解。