Upload
alan-tsai
View
570
Download
0
Embed Size (px)
Citation preview
1
Nuget 介紹如何使用和建立 package
Alan Tsai
2016-05-13
2Agenda
什麼是 nuget ? 為什麼要有 nuget
使用 nuget package
建立自己的 package Nuget Package Explorer Nuget 結構 使用 csproj 使用 nuspec
3關於我 Alan Tsai Web Developer - 主要後端技術使用 .Net/C# 和 Asp .Net Mvc
喜歡學一些新的東西 Blog
Alan Tsai 的學習筆記 (http://blog.alantsai.net/) Linkedin: http://linkedin.alantsai.net [email protected]
4
什麼是 nuget ?該如何使用?
5什麼是 Nuget
Package Manager 方便安裝 library 自動安裝 library 所需要的 dependency 管理 library 的版本 – 自動更新 再也不用因為忘記安裝 xxx 導致網站無法執行
同等於其他系統的: Java – Maven Node – NPM Javascript - Bower
6名詞定義 nuget 可以代表兩個意思1. Library package
例如,你可以去安裝 xxx nuget
2. 代表 nuget org Nuget.org 是微軟 host package 的地方
7如何使用 可以從 GUI 的方式 或者可以用 Package Manager Console
8GUI 的方式 對專案點右鍵 選擇 Manage Nuget Package
9GUI 的方式 注意一下左邊是切換目前模式 在第 2 點可以切換是否使用 Pre Release 版本
VS
10Package Manager Console
從 Visual Studio 的 Tool -> Nuget Package Manager -> Package Manager Console 來打開
能夠直接輸入指令:Install-Package Newtonsoft.Json
11使用 nuget 對專案會加入什麼 在 solution 層級會加入一個 packages 資料夾
這個會放下載下來的 nuget package 可加入或不加入版控
在 project 等級會加入 packages.config 這個會記錄這個 project 用到什麼 package 一定要加入版控 一個 xml 檔案 在未來的 .Net 這個檔案會換成 json 檔案
12回復 Package 資料夾 如果 Package 沒有版控 什麼都不用做
VS 啟動自動回復 Package Nuget 2.7 之後支援
13Nuget package 的 gitignore
# 忽略 NuGet Packages*.nupkg
# 忽略下載 packages 的資料夾 **/packages/*
# 但是保留 build/ 資料夾 , 用作於 package 的 MSBuild target.!**/packages/build/
# 下面這行可有可無 - 就算沒有也會自動產生#!**/packages/repositories.config
14
建立自己的 nuget package
15
了解 nuget package 結構
16Nuget Package Explorer (NPE)
https://npe.codeplex.com/downloads/get/clickOnce/NuGetPackageExplorer.application
可以用來了解和建立 package – 打開 Json.Net
17Nuget package 結構 四個特殊資料夾 lib
放 library ,自動加入 project reference
content 非 library 類型要加入專案的內容
tools 安裝 package 的時候,可以執行的 powershell script
build 加入到 MSBuild 的 Target
18Nuget package meta 資訊 NPE 左邊的就是 meta 資訊 比較重要:
Id :這個是唯一值 當用 Package Management Console 做 Install-Package 的時候用的
Title: 名稱 Version: library 的版本 Release Note :版本調整內容 Dependency :這個 package 還需要那些其他的 package 才能運作
19建立 nuget 的方式 NPE 建立 使用 nuspec 配上 project 檔案 只有 nuspec 檔案
20
NPE 建立
21NPE 建立 打開 NPE 選擇 Create a new package
左邊 meta 資訊輸入完 右邊開始加入檔案
lib content
22NPE 建立的優缺點 優點
直覺 好操作
缺點 不同人做可能結果不同 無法自動化
結論 用來了解就好,不建議用這個方式
23
nuspec + project
24Nuspec 配上 Project
思考一下 其實 project 建立出來不就是 dll
如果有用其他 library 不就是 Dependency
meta 有些資訊其實 project 就有了 例如:版本
Nuget 有提供 nuspec 檔案配上 project Nuspec 提供一些 meta 資訊 Project 就是 dll 產生處
25Nuspec 配上 project – nuspec 設定 設定
Nuspec 檔案檔名同 project ,並且在同資料夾 例如有個
Net35Library.csprojNet35Library.nuspec
Nuspec 檔案內容 $$ 參數是會從專案傳入
<?xml version="1.0"?><package > <metadata> <id>$id$</id> <version>$version$</version> <title>$title$</title> <authors>$author$</authors> <owners>$author$</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>$description$</description> </metadata></package>
26Nuspec 配上 project – project 設定 Project\Properties\AssemblyInfo.cs
設定的值會帶過去
27Nuspec 配上 project
執行
加一些 build 參數例如 使用 release :
產生
nuget pack {csproj location} -build
{id}{ 版號 }.nupkg
nuget pack {csproj location} -build -Prop Configuration=Release
28Nuspec 配上 project
優點 自動把 build 內容放到 lib 資料夾 自動把檔案放到 content 自動加入任何 nuget Dependency
缺點 不一定所有 content 都要放
可以執行 nuget 的時候加上 – exclude 來過濾不加入 不適合一個 package 要
包多個 project 的 dll 同 dll 要有多個 framework 的版本在同個 package
結論 一般一個專案一個 package 很適合這種類型
29
只使用 nuspec
30只使用 nuspec
Nuspec 設定 package meta 資訊 Package 內容則是從 nuspec 檔案的目前位置的其他內容組成
31為什麼想使用這種模式 Package 裡面內容不一定只是從單一 project 出來 或許這個 package 提供不同 target .net framework 的 dll
任何 .net framework project 只需要裝同一個 package 而不用考慮 .net framework 版本是否正確
或許這個 package 包含 1 個 project 以上的 dll 才有作用
32使用方式 – 設定 Nuspec 一樣用來提供 package meta 資訊
空的 nuspec 檔案可以用指令 產生
要放入 package 內容則是依照 nuspec 位置的檔案結構而放 例如,我想建立一個和 NPE 範例一樣的 package ,我的結構會是:
兩個資料夾內容會進入 package content
lib
nuget spec
33使用方式 – 建立 package
執行
產生nuget pack {nuspec 路徑 }
{id}{ 版號 }.nupkg
34
測試建立出來的 Package
35設定 Visual Studio 的 Package 位置 可以在 VS 搜索 nuget – 選擇 Package Source 建立一個新的 file system 的位置 把剛剛 nupkg 丟進去就可以了
36
結語
37建立 package 方式總結建立方式 優點 缺點 使用情景
Nuget Package Explorer
• 直覺 – 填入欄位就好
• 簡單操作 – 不需要懂內部結構
• 每個人建立出來可能不同
• 無法自動化• 建立一次性
package
• 學習建立 package
Nuspec + project
• 建立出來 dll 自動放入 lib
• 專案其他檔案自動放入 content
• 可以自動化
如果 package 內容不止在一個 project 裡面,不方便加入
一個 project 代表一個nuget package
Nuspec
• 加入 package 的內容自動從 nuspec目錄下面取得
• 可以加入任意檔案• 可以自動化
會需要一些 script 比較容易產生
如果一個 project 不能夠簡單建立出一個package
38Reference
Nuget doc (官方文件 ) https://docs.nuget.org/ nuspec 檔案內容 https://docs.nuget.org/create/nuspec-reference
Github 範例專案: https://github.com/alantsai-samples/Nuget-Package-Create-Sample
我的部落格 Nuget 使用
http://blog.alantsai.net/2016/03/what-is-nuget-how-to-use-nuget-and-how-to-restore-properly.html
Nuget 檔案結構 http://
blog.alantsai.net/2016/04/create-nuget-with-nuget-package-explorer-understand-nuget-package-structure.html
39
謝謝大家Q & A