.NET世界的包管理器——Nuget

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)備好了瞻离。

  1. 在VS中創(chuàng)建一個(gè)Empty Web Application
  2. 選擇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)集成腾它。
  3. 在步驟1新建的Web Application中的Reference上右擊跑筝, 選擇Manage Nuget Package
  4. 在彈出的對(duì)話中, 選擇Online Tab瞒滴, 然后搜索NugetServer曲梗, 點(diǎn)擊安裝
  5. 修改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

  1. 新建lib文件夾
  2. 將需要打包的dll放到lib文件夾下秩彤。放到lib文件夾下的目的是在使用Nuget添加引用后dll可以自動(dòng)地添加到reference中
  3. 在DOS Console中將目錄跳轉(zhuǎn)到lib文件夾所在的目錄,執(zhí)行命令 Nuget Spec xxx.dll
  4. 上一步的命令會(huì)生成一個(gè)nuspec文件事哭, 需要手動(dòng)編輯這個(gè)文件漫雷,制定PackageID, Version等信息
  5. 執(zhí)行 Nuget Pack xxx.dll.nuspec即可
  6. 執(zhí)行 Nuget Push [PackageID] -s [NugetServerUrl] [ApiKey]推送到Nuget Server了

為Project制作Package

  1. 將目錄跳轉(zhuǎn)到Solution根目錄
  2. 執(zhí)行命令Nuget Pack xxx.csproj -Build -Prop Configuration=Release -IncludeReferencedProjects即可生成Package
  3. 執(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ā)布

  1. 制作打包批處理
if exist $1*.nupkg del $1*.nupkg
nuget pack $2 -Build -Prop Configuration=Release -IncludeReferencedProjects -o $1
  1. 制作上傳包文件到nuget server feed的批處理
nuget push $1*.nupkg -s [NugetServerURL] [ApiKey]

將[NugetServerURL]和[ApiKey]替換成你自己的NugetServerFeed地址和key

  1. 在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就是幾
  2. 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ì)被更新嵌屎。

  3. 如果一個(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内贮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末产园,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夜郁,更是在濱河造成了極大的恐慌什燕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竞端,死亡現(xiàn)場(chǎng)離奇詭異屎即,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)事富,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門技俐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人统台,你說我怎么就攤上這事雕擂。” “怎么了贱勃?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵井赌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我贵扰,道長(zhǎng)仇穗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任戚绕,我火速辦了婚禮纹坐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舞丛。我一直安慰自己恰画,他們只是感情好宾茂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拴还,像睡著了一般跨晴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上片林,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天端盆,我揣著相機(jī)與錄音,去河邊找鬼费封。 笑死焕妙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弓摘。 我是一名探鬼主播焚鹊,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼韧献!你這毒婦竟也來了末患?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锤窑,失蹤者是張志新(化名)和其女友劉穎璧针,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渊啰,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡探橱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绘证。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隧膏。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嚷那,靈堂內(nèi)的尸體忽然破棺而出私植,到底是詐尸還是另有隱情,我是刑警寧澤车酣,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布曲稼,位于F島的核電站,受9級(jí)特大地震影響湖员,放射性物質(zhì)發(fā)生泄漏贫悄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一娘摔、第九天 我趴在偏房一處隱蔽的房頂上張望窄坦。 院中可真熱鬧,春花似錦、人聲如沸鸭津。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逆趋。三九已至盏阶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闻书,已是汗流浹背名斟。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魄眉,地道東北人砰盐。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坑律,于是被迫代替她去往敵國(guó)和親岩梳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理晃择,服務(wù)發(fā)現(xiàn)冀值,斷路器,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 2015年7月30日 本文作者是 Managed Languages 團(tuán)隊(duì)項(xiàng)目經(jīng)理 Lucian Wischik。...
    OneAPM閱讀 2,629評(píng)論 1 5
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,074評(píng)論 25 707
  • 你好像瘦了膘魄,頭發(fā)也變長(zhǎng)了乌逐,背影陌生到讓我覺得見你是上個(gè)世紀(jì)的事,然后你開口叫我名字创葡,我就想笑浙踢,好像自己剛剛下班,只...
    小北北北閱讀 261評(píng)論 0 0
  • 如有轉(zhuǎn)載灿渴,請(qǐng)標(biāo)明出處:iOS runtime如何交換兩個(gè)類方法 runtime交換實(shí)例方法洛波,老生常談的問題,很多b...
    whlpkk閱讀 3,256評(píng)論 0 7