【Unity】使用Verdaccio爲Unity Package Manager搭建私有npm包服務器

使用Verdaccio爲Unity Package Manager搭建私有npm服務器

重要說明:根據Unity中國團隊的反饋,官方對於私有npm服務器的態度還不確定(擔心濫用)。現在國際版Unity不限制私有服務器,可以直接使用私有服務器;國內版Unity限制私有服務器, 需要聯繫Unity團隊發放License才能使用私有服務器 。這個License是個獨立的License,不是Unity Personal/Pro的那個License。最好仔細評估需求後再決定是否要使用私有npm服務器。
如果私有npm服務器可以在瀏覽器正常訪問,但Unity配置了私有npm服務器之後Console報錯 Unable to connect "http://localhost:4873" ,則表明需要申請License。

版本需求

  • Unity 2019.1.0+
  • Node.js 10.0+
  • Verdaccio 4.5.0+

1. 使用Verdaccio搭建私有npm服務器


1.1. 安裝Node.js

Windows操作系統

Node.js下載頁面下載最新LTS版安裝包,然後運行安裝包進行安裝即可。

Ubuntu操作系統

Verdaccio的 4.5.0 及更高版本要求Node.js的版本不低於 10 ,但Ubuntu 20.04的包管理器默認只能安裝 8.x 版本的Node.js,所以這裏要執行一些額外的命令,不過也很簡單。在終端依次執行以下2條命令即可安裝Node.js:

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

上面第一條命令中的url中的 12 可以替換成 1014 ,對應將要安裝的Node.js的版本。12 是LTS版本,沒特殊需求的話用LTS版本比較好。

其他Linux版本參考 Node.js安裝指令文檔


1.2. 安裝Verdaccio

Windows操作系統

在命令提示符(或PowerShell)中 以管理員身份 執行以下命令安裝Verdaccio:

npm install -g verdaccio

如果命令提示符(或PowerShell)報錯提示 無法加載文件xxx,因爲在此係統中禁止執行腳本 ,在命令提示符(或PowerShell)中 以管理員身份 執行以下命令,然後再重新執行上面的安裝命令:

Set-ExecutionPolicy RemoteSigned

Linux操作系統

在終端中執行以下命令安裝Verdaccio:

sudo npm install -g verdaccio

執行命令後,等待安裝完成即可。如果終端報錯提示 permission denied ,嘗試用以下命令代替上面的安裝命令:

sudo npm install -g verdaccio --unsafe-perm=true --allow-root

1.3. 啓動Verdaccio服務器

在終端(或命令提示符或PowerShell)中執行以下命令啓動Verdaccio服務器:

verdaccio

Verdaccio啓動後不會返回交互窗口,而是會一直打印運行日誌,直到進程結束。日誌的起始幾行會說明當前服務器的配置文件位置以及訪問地址。如下圖所示:

Verdaccio運行狀態

啓動完成後,在瀏覽器中訪問私服地址(本例中是 http://localhost:4873/ ),可看到如下頁面:

Verdaccio私服首頁

至此,私有npm服務器的搭建完成。Verdaccio的更多配置方法和高級用法,可以參考官方發佈的 Verdaccio配置文檔


2. 將自己的Unity工具發佈到私有npm服務器


2.1. 在本地創建併發布Unity Package

2.1.1. 創建新的包

首先需要在Unity的Package Manager中安裝 Package Development 包,後續的自建包的管理過程依賴此包。

Package Development包

安裝好 Package Development 包後,在Package Manager窗口的左上角 加號菜單 中會多出一個 Create Package… 選項。

Create Package按鈕

點擊 Create Package… ,在出現的輸入框中輸入自己的包名(以MyPackage爲例,後同),然後點擊 Create 按鈕,即可完成創建。

創建新包

2.1.2. 配置包的Manifest信息

等待Unity導入新包完成後,Project窗口的Packages文件夾中會多出一個 MyPackage 文件夾,選中文件夾中的 package.json 文件,即可在Inspector窗口編輯包的manifest信息。包的manifest信息中主要包含了包的 唯一標識名稱顯示名稱版本號類型支持的最低Unity版本簡要說明依賴項可見性

包Manifest信息

其中包的 類型 會影響包在編輯器中的可見性,但Unity文檔中未對此項做出說明,可以在設置時將包的 可見性(Visibility in Editor) 設爲 總是可見(Always Visible) 。如果不小心隱藏了包,可以在Package Manager窗口中找到該包,然後點擊窗口右下角的 筆形按鈕 打開包的manifest信息編輯窗口重新設置可見性。

更詳細的包配置說明,可以參考官方發佈的包Manifest文檔

2.1.3. 將包發佈到本地

配置好包信息後,即可將自己的代碼和資源文件按類型放置到 MyPackage 文件夾下的對應文件夾中。

包開發完成後,可以在Package Manager窗口中選中包,通過窗口底部的按鈕對包進行 測試驗證移除編輯信息發佈 。點擊 發佈 按鈕,即可將包在本地發佈爲tarball壓縮包。發佈成功後Console會輸出tarball壓縮包所在文件夾的路徑。

包管理主頁

tarball包文件


2.2. 將本地的Unity Package發佈到私有npm服務器

2.2.1. 登錄到私有npm服務器

在向私服發佈包前,要先登錄到私服。如果沒有登錄過,可以在終端執行下面的命令,然後按提示依次輸入 用戶名密碼郵箱 即可完成登錄:

npm adduser --registry http://localhost:4873

登錄成功後,終端會輸出提示信息:

Logged in as your_name on http://localhost:4873/.

2.2.2. 將包發佈到私有服務器

將發佈得到的tarball解壓,然後在終端中進入包文件夾的跟目標(和package.json同級),之後在終端中執行以下命令即可將包發佈到私服:

npm publish --registry http://localhost:4873

執行命令後終端輸出包信息,最後一行會顯示包的名稱和版本:

+ [email protected]

注意,一定不要忘記加 --registry http://localhost:4873 參數,否則會將包發佈到公共的npm服務器上(如果沒有登錄則會發布失敗)。如果不小心將包發佈到了公共npm服務器上,可以在 24 小時內刪除(Verdaccio私服不限制刪除)。刪除已發佈的包的命令是:

npm unpublish --force --registry http://localhost:4873

發佈完成後,刷新本地服務器主頁,可以看到包已經在主頁列出。點擊包名,可以查看更詳細的信息。

MyPackage條目


3. 配置Unity工程從私有npm服務器加載package

爲了避免干擾,首先把通過Package Manager創建的本地的 MyPackage 從項目中移除。


3.1. 向Unity編輯器註冊私有npm服務器

打開Unity工程包配置文件 manifest.json (工程根目錄/Packages/manifest.json),在其中添加 scopedRegistries 屬性,如下所示:

{
  "scopedRegistries": [
    {
      "name": "My Registry",
      "url": "http://localhost:4873",
      "scopes": [
        "com.mycompany"
      ]
    }
  ],
  "dependencies": {
    ...
  }
}

上面的配置中, url 是私有npm服務器的地址, scopes 用於包名匹配,暫時沒有發現 name 屬性的用途。注意 scopedRegistriesscopes 的類型,是數組。

關於包名匹配的詳細說明,可以參考官方的 私有包服務器文檔


3.2. 從私有npm服務器安裝包

完成上一步的註冊後,打開Unity的Package Manager窗口,將包的篩選條件選爲 All packages ,在 Advanced 菜單中啓用 Show preview packages (如果發佈包前對包進行過驗證,則無需啓用此項)。等包列表刷新完成後,可以在列表中找到 MyPackage ,此後可以像使用其他由Unity發佈的包一樣使用自己的包。

從私服加載的MyPackage

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章