随着公司業務慢慢的拓展,項目便會越來越來多,很多項目會依賴其他項目DLL,比如一些底層的技術架構DLL引用,還有各業務系統的也有可能會有引用的可能。
項目多,交叉引用多,如果要是有一個DLL更新,那就要更新所有引用該DLL的項目,手動更新的話,有時候找到都很困難,更别說更新了,長此以往,更新DLL會變得很困難,那有什麼辦法來解決這個問題 ?
對NuGet,話說微軟真是為廣大使用者着想,整出這麼個好東西。我估計微軟内部DLL也亂得不像樣子,然後才有NuGet 這個産物。NuGet 管理程式包工具,Visual Studio 2012&2013 完全內建了這套工具。
但是今天講的是如何在公司内部搭建NuGet Server,來管理公司内部程式包。使内部程式包引用容易,更新版本容易。廢話就不多說了,直接入正題。
搭建NuGet Server 是不是建一個Web站點一樣,然後挂在IIS上面? 對的,就是這麼回事,建一個網站,管理程式包,能夠上傳,能夠下載下傳,且能夠做簡單版本管理。
我要說的是,站點确實要建,但是怎麼管理程式包,上傳,下載下傳也好等,大家不要擔心這些都有人已經做好了,隻要拿來使用就可以了。接下來搞真的了。
一. NuGetServer 搭建和配置
1. 建立一個 “NuGetServerSolution” 解決方案,然後新增 “NuGetServer” Asp.Net 網站 或者 應用程式 空 項目。結構如下圖
2. 在 “NuGetServer” 項目上,右鍵選擇 “管理NuGet程式包” ,選擇 “聯機” ,右上角搜尋框中輸入“NuGet.Server” Enter,在搜尋結果中選擇 NuGet.Server 項,進行安裝,如圖
如果安裝最後,提示 替換 Web.config ,請選擇 全是。
3. 編譯“NuGetServer”項目,如果沒有出異常,這裡就建立項目完成,NuGetServer 就這麼簡單建成,稍後我部署到IIS上面,看看是不是真的可以了,先來講一下這個網站WebConfig 要配置地方。
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<appSettings>
<!--
Determines if an Api Key is required to push\delete packages from the server.
-->
<add key="requireApiKey" value="true" />
<!--
Set the value here to allow people to push/delete packages from the server.
NOTE: This is a shared key (password) for all users.
-->
<add key="apiKey" value="0226651E-19EE-4F93-A172-5250C84DB16C" />
<!--
Change the path to the packages folder. Default is ~/Packages.
This can be a virtual or physical path.
-->
<add key="packagesPath" value="" />
<!--
Set allowOverrideExistingPackageOnPush to false to mimic NuGet.org\'s behaviour (do not allow overwriting packages with same id + version).
-->
<add key="allowOverrideExistingPackageOnPush" value="false" />
<!--
Set ignoreSymbolsPackages to true to filter out symbols packages. Since NuGet.Server does not come with a symbol server,
it makes sense to ignore this type of packages. When enabled, files named `.symbols.nupkg` or packages containing a `/src` folder will be ignored.
If you only push .symbols.nupkg packages, set this to false so that packages can be uploaded.
-->
<add key="ignoreSymbolsPackages" value="true" />
<!--
Set enableDelisting to true to enable delist instead of delete as a result of a "nuget delete" command.
- delete: package is deleted from the repository\'s local filesystem.
- delist:
- "nuget delete": the "hidden" file attribute of the corresponding nupkg on the repository local filesystem is turned on instead of deleting the file.
- "nuget list" skips delisted packages, i.e. those that have the hidden attribute set on their nupkg.
- "nuget install packageid -version version" command will succeed for both listed and delisted packages.
e.g. delisted packages can still be downloaded by clients that explicitly specify their version.
-->
<add key="enableDelisting" value="false" />
<!--
Set enableFrameworkFiltering to true to enable filtering packages by their supported frameworks during search.
-->
<add key="enableFrameworkFiltering" value="false" />
<!--
When running NuGet.Server in a NAT network, ASP.NET may embed the erver\'s internal IP address in the V2 feed.
Uncomment the following configuration entry to enable NAT support.
-->
<!-- <add key="aspnet:UseHostHeaderForRequestUrl" value="true" /> -->
</appSettings>
<system.web>
<httpRuntime maxRequestLength="31457280" />
<compilation debug="true" />
</system.web>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
<system.webServer>
<staticContent>
<mimeMap fileExtension=".nupkg" mimeType="application/zip" />
</staticContent>
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
</configuration>
第一點: 程式包釋出,存放的路徑,在WebConfig appSettings PackagesPath 這個Key 設定,預設存放在部署的網站根目錄Packages檔案夾。
第二點:appSettings requireApiKey 這個key 如果設定成 true , appSettings apiKey 是必須要設定的,這個就像密碼一樣。可以阻止不知道這個apiKey人通路到程式包
4. 部署到IIS, 打開IIS ,右鍵選擇 “網站” ,添加網站,填寫 網站名稱(NuGetServer),選擇實體路徑,端口号 改成 "1000" 确定, 如下圖
5. 運作 NuGetServer 網站 "http://localhost:1000/", 出現下圖效果,則說NuGet 伺服器 已經建立完成。
6. 接着配置Visual Studio 連接配接 NuGetServer。選擇“工具”菜單,選擇“選項”,彈出“選項”界面,選擇 “NuGet Package Manager” ,然後在選擇 “程式包源”,
點選 “+”,在界面下方 設定 名稱 “mynuget.org” 随便取,設定 源 “http://localhost:1000/nuget” (是不是上圖有說),确定 關閉界面,回到項目。如下圖
在項目右鍵,選擇“管理NuGet程式包”,聯機,下面是不是多出了一個 “mynuget.org” 程式源呢,雖然下面還沒有釋出公司内部的程式包。如下圖
到此,NuGetServer 伺服器,就搭建并配置完成。接一下來就是如何釋出程式包,以及安裝程式包了。
二. 釋出程式包,以及安裝程式包
1. NuGet Package Explorer
将程式包釋出到NuGetServer,還要介紹到另外一個工具“NuGet Package Explorer”,這個工具是NuGetServer 程式包一個可視化的工具,它功能很多,可浏覽已經釋出的程式包資訊,可以釋出新的程式包(設定程式包版本,已經依賴程式包等),可以删除釋出的程式包。
CodePlex:https://npe.codeplex.com/
GitHub:https://github.com/NuGetPackageExplorer
2.在CodePlex 網站上,下載下傳 NuGet Package Explorer , 安裝完成後,桌面會多出一個 “NuGet Package Explorer” 圖示,如下圖
3. 為了友善Demo,再建立一個 解決方案 “NuGetServerDemoSolution”,添加“NuGetServerDemo” 控制台項目,再添加 “NuGetServerDemoDLL” 類庫項目,結構如下圖。
“NuGetServerDemoDLL” 項目 主要會做成程式包釋出
“NuGetServerDemo” 項目 安裝“NuGetServerDemoDLL” 程式包
4 . 打開 桌面 “NuGet Package Explorer” ,界面如下
圖檔選項, 分别 意思是,1. 打開本地的nupkg,nuspec 檔案。2. 打開指定 NuGetServer 所有的程式包清單。3.建立一個新程式包。4. 文檔
5.把 “NuGetServerDemoDLL” 釋出到NuGetServer,點 “Create a new package” 未設定前截圖如下
上圖分為兩個編輯區,一個是 Package Metadata 負責描述程式包資訊的,Package Contents 負責程式封包件相關的。
點選 Package Metadata 區 “編輯” 按鈕,想編輯 “NuGetServerDemoDLL” 程式包描述資訊。
然後 将“NuGetServerDemoDLL” 項目 産生Dll,拖入 Package Contents 最後效果如下圖
點選 上圖 綠色的 √ 關閉編輯Package Metadata , 點選 ”File“ 菜單,選擇 Publish 釋出程式集,填寫 PublishUrl(NuGetServer),PublishKey(apiKey),填寫完成 點選“Publish” 釋出,如果下方提示 “Package published successfully”,則釋出成功。如下圖。
6. 回到“NuGetServerDemoSolution” 解決方案,右鍵“NuGetServerDemo”,選擇“管理NuGet程式包”,選擇聯機下“mynuget.org”,安裝“NuGetServerDemoDLL” 程式包,如下圖
主要看圖左邊的 ,是不是“NuGet Package Explorer” 中設定過的一些程式包資訊。
7. 用“NuGet Package Explorer”檢視 NuGetServer 以釋出程式包,選擇“File”菜單,選擇"Open from feed", 就會查詢到指定 NuGetServer 釋出程式包,如下圖。
版本變更了,更新DLL 這邊就不來說了,大家自己摸索一下。謝謝。
好了,整個博文結束,這裡想再提一下 NuGetServer 伺服器部分,我這裡也隻是抛磚引玉一下,還“NuGet Package Explorer”也是,大家有空可以用點時間深入研究一下。
NuGetServer 源代碼 由于今天還在下載下傳GitHub工具(網速非常之慢),明天會抽空,在提供GitHub位址。
NuGetServer 源代碼 : https://github.com/haibozhou1011/NuGetServer
另為,今天在部落格園裡面右邊則欄加一個“打賞”功能,就支援微信,支付寶。大家玩一下。謝謝!