NugetServer 使用指南
為什么要使用Nuget
在我們的項(xiàng)目, 存在著一些公共Dll, 這些Dll被大量的項(xiàng)目所引用舌剂。同時(shí)這些公共dll也同時(shí)在進(jìn)行版本升級(jí), 由于缺乏版本管理暑椰,這些Dll會(huì)被到處Copy霍转,導(dǎo)致各個(gè)項(xiàng)目所應(yīng)用的版本不一致。
極端的情況是A項(xiàng)目和B項(xiàng)目都引用了一些Common Dll一汽, 他們引用的Common Dll版本還可能不一致避消, 隨著需求的變化,可能在某一天就會(huì)出現(xiàn)讓A項(xiàng)目依賴B項(xiàng)目的情況角虫。
這時(shí)我們就可能陷入dll版本陷阱中沾谓。
如果我們有一個(gè)好的包管理器, 當(dāng)管理器中的包升級(jí)的時(shí)候,依賴這個(gè)包的項(xiàng)目可以得到提示,那么我們就可以這簡(jiǎn)單地讓我們的項(xiàng)目始終依賴最新的dll版本多柑, 可以很自然的避免版本陷阱的發(fā)生逊抡。
在.net的世界里, 這個(gè)包管理器就是Nuget
Nuget Server搭建
Nuget Server的搭建十分簡(jiǎn)單羽德, 微軟已經(jīng)為我們什么都準(zhǔn)備好了瞻离。
- 在VS中創(chuàng)建一個(gè)Empty Web Application
- 選擇Tools > Library Package Manager > Package Manager Setting秉溉,確認(rèn)Package Manager的Package Sources已經(jīng)添加nuget官方源:https://www.nuget.org/api/v2/,
VS2013以上版本應(yīng)該已經(jīng)集成腾它。 - 在步驟1新建的Web Application中的Reference上右擊跑筝, 選擇Manage Nuget Package
- 在彈出的對(duì)話中, 選擇Online Tab瞒滴, 然后搜索NugetServer曲梗, 點(diǎn)擊安裝
- 修改web.config的requireApiKey=False, 或者設(shè)置requireApiKey=true,則必須設(shè)置apiKey妓忍,否則Push Package會(huì)報(bào)403錯(cuò)誤
至此虏两, 一個(gè)NugetServer就搞定了, 很簡(jiǎn)單吧世剖?趕緊將Server部署起來吧6ò铡!旁瘫!
添加Nuget Server Feed
記得在Nuget Server搭建部分講的怎么確認(rèn)nuget官方源是否已添加嗎祖凫? 你已經(jīng)知道怎么添加我們自己的Nuget Server源了吧。
添加好源之后酬凳, 只要把我們Nuget Package放到Server根目錄的Packages的文件夾下惠况,這個(gè)Package就可以被我們使用了
如何制作Nuget Package
在我們的項(xiàng)目里, 有兩種dll我們需要利用Nuget來進(jìn)行版本管理宁仔。
- 第三方Dll售滤, 我們沒有源碼, 為了保證各個(gè)項(xiàng)目中引用的版本能夠保持一致台诗, 且能夠同時(shí)得到更新完箩,我們需要Nuget
- 我們自己產(chǎn)生的公共Dll, 大量的項(xiàng)目都在引用這些Dll拉队, 我們也需要Nuget
在制作Nuget Package之前弊知,我們需要下載Nuget.exe。
下載好之后將Nuget.exe存放的目錄配置到環(huán)境變量里粱快,以便PowerShell能夠認(rèn)識(shí)nuget Command
為第三方Dll制作Package
- 新建lib文件夾
- 將需要打包的dll放到lib文件夾下秩彤。放到lib文件夾下的目的是在使用Nuget添加引用后dll可以自動(dòng)地添加到reference中
- 在DOS Console中將目錄跳轉(zhuǎn)到lib文件夾所在的目錄,執(zhí)行命令
Nuget Spec xxx.dll
- 上一步的命令會(huì)生成一個(gè)nuspec文件事哭, 需要手動(dòng)編輯這個(gè)文件漫雷,制定PackageID, Version等信息
- 執(zhí)行
Nuget Pack xxx.dll.nuspec
即可 - 執(zhí)行
Nuget Push [PackageID] -s [NugetServerUrl] [ApiKey]
推送到Nuget Server了
為Project制作Package
- 將目錄跳轉(zhuǎn)到Solution根目錄
- 執(zhí)行命令
Nuget Pack xxx.csproj -Build -Prop Configuration=Release -IncludeReferencedProjects
即可生成Package - 執(zhí)行命令
Nuget Push [PackageID] -s [NugetServerUrl] [ApiKey]
推送到Nuget Server了
從Nuget Server引用Package
有兩種方式:
- 通過Nuget Package Manager來引用
- 通過命令行來引用
這里講幾個(gè)常用命令行的操作鳍咱, 通過Tools > Nuget Package Manager > Packge Manage Console, 打開Package Manage Console
- 查看可用的Package
Get-Package -AvailablePackage
- 安裝Package
Install-Package [PackageID] [-Version]
- 更新Package
Update-Package
- 卸載Package
UnInstall-Package
- 清空本地nuget Package Cache
nuget locals all -clear
- 這些命令的具體用法降盹,可以通過
Get-Help Command
查找?guī)椭?/li>
一鍵打包一鍵發(fā)布
- 制作打包批處理
if exist $1*.nupkg del $1*.nupkg
nuget pack $2 -Build -Prop Configuration=Release -IncludeReferencedProjects -o $1
- 制作上傳包文件到nuget server feed的批處理
nuget push $1*.nupkg -s [NugetServerURL] [ApiKey]
將[NugetServerURL]和[ApiKey]替換成你自己的NugetServerFeed地址和key
-
在Visual Studio的Project右鍵菜單上添加Pack Nuget Package和Publish Nuget Package菜單
- Tools 》External Tools... 添加External Command
- Tools 》 Cutomize... 》Commands 》Context menu... 》Project and Solution Context Menus | Project
- Add Command 》 Tools
- 選擇External Command n, n就是你之前添加在External Tools中的External Command的是第幾個(gè)這里的n就是幾
Nuget Server是嚴(yán)格按照版本號(hào)來進(jìn)行包管理的谤辜,如果同一個(gè)版本號(hào)的Package被多次被推送到Nuget Server Feed蓄坏,后推送的會(huì)覆蓋之前推送的版本价捧。但是本地引用的Package還是沒有更新,原因是因?yàn)樵谝肗uget Server Feed上的Package的時(shí)候涡戳,不但會(huì)引用到Solution目錄的packages目錄下结蟋,同時(shí)也會(huì)被緩存在.nuget的公共緩存目錄。多次推送一定要清空公共目錄緩存渔彰,否則Solution下的packages文件夾中的Package不會(huì)被更新嵌屎。
如果一個(gè)Solution下面包含的所有Project都要用Nuget來進(jìn)行包管理,并且它們之間存在依賴關(guān)系恍涂,則應(yīng)該按照依賴關(guān)系由弱到強(qiáng)的順序進(jìn)行打包并Push到Nuget Server编整。如果Pack的時(shí)候選擇了IncludeReferencedProjects參數(shù),引用關(guān)系強(qiáng)的Project會(huì)自動(dòng)引用依賴關(guān)系弱的Project乳丰,前提是項(xiàng)目目錄下要有nuspec文件,否則會(huì)直接將引用項(xiàng)目的dll包含到Package内贮。