自建 NuGet Server

自從 Visual Studio 2010 第一次使用 NuGet 後,開發生涯就此改變了,簡易的套件安裝及管理方式,讓開發人員不需要在自行保留需要的 dll,需要的 config 也可以透過 NuGet 安裝來加入,大幅地減少開發時繁瑣的工作

但有些公司的資安政策並不允許外部連線,這也造成 NuGet 無法使用,一般的解決方式就是透過共用網路資料夾來分享可能會用到的 dll,只是這樣的方式終究不如 NuGet 來得便利

最近的專案有些共用元件,原本都是透過 dll 參考,但常遇到 dll 有更新時,shared folder 中的 dll 檔案被更新,造成不需要使用新版 dll 的 module 也一併被迫使用新版 dll,無形中造成不少問題。所以打算利用自建內部 NuGet Server 來解決問題,因為 NuGet 不同版本可以共存,至少可以讓不需升級的 module 繼續使用舊版本,而不用被迫升級。

建立 Web Application

  1. 使用 Installed template 建立專案 –> ASP.NET Web Application(.NET Framework)

    1addwebapp

  2. 使用 Empty template

    2empty

安裝 NuGet.Server

兩種方法擇一即可,安裝完成會異動到下列內容

  1. 加入 Default.aspx
  2. 加入 favicon.ico
  3. 新增 DataServices 資料夾並加入 Packages.svc 與 Routes.cs
  4. 新增 Packages 資料夾並加入 Readme.txt
  5. 修改 {專案名稱}.csproj
  6. 修改 packages.config
  7. 修改 Web.config

2-1change

  1. Package Manager UI

    • 專案 上按右鍵 –> Manage NuGet Packages…

      3nabage

    • Browse tab –> 搜尋 NuGet.Server –> Install

      4install

  2. Package Manager Console

    • Visual Studio 主選單 Tools –> NuGet Package Manager –> Package Manager Console

      5mangeconsole

    • 執行 Install-Package NuGet.Server

      6installpackage

  • 如果 ASP.NET Web Application 的 .NET Framework 是 4.5.2 , NuGet.Server 需安裝 2.10.3 版本,最新版為 2.11.3

調整 web.config

  1. requireApiKey

    設定 push 或是 delete NuGet packages 是否需要 Api Key

  2. apiKey

    設定 Api Key ,如果 requireApiKey 是 true,這個值就一定得給,否則無法 push package

  3. packagesPath

    指定 package 儲存目錄,可以是虛擬或是實體目錄,預設是 ~/Packages

  4. allowOverrideExistingPackageOnPush

    設定 packages 有相同 id + 版號 時是否允許覆蓋。預設是 false ,與 NuGet.org 相同 - 不允許覆蓋

  5. ignoreSymbolsPackages

    設定是否忽略 symbols packages - .symbols.nupkg 與 packages 中包含 /src 資料夾的檔案都會被忽略 ,因為 NuGet.Server 沒有包含 symbol server 功能

  6. enableDelisting

    設定是否以 delist 取代 delete

    • delete 會直接刪除檔案
    • delist 會將檔案設為隱藏,nuget list 時會略過被 delist 的 package,但指定 package 版本安裝時(nuget install packageid -version version)可以正常取得檔案,避免特定版本的相依出現問題
  7. enableFrameworkFiltering

    設定是否可以依 .NET Framework 來過濾 package

  8. aspnet:UseHostHeaderForRequestUrl

    如果是 NAT - Network Address Translation 網路環境才需啟用

成功安裝

7result

  1. 提供加入 NuGet Source Url (供 Visual Studio 加入用)

    http://localhost:15069/nuget

  2. Push NuGet package 的 Url (發行 NuGet package 用)

    nuget.exe push {package file} {apikey} -Source http://localhost:15069/api/v2/package

心得

安裝上很簡易,缺點是畫面醜醜的,但我們工程師在意的是功能,絕對不會因為畫面難看就嫌棄它的XD

參考資訊

  1. NuGet.Server