基於node的前端組件包發布至nexus和npmjs


目錄

目錄... 3

1、 前言... 1

2、 配置... 1

2.1、 建立組件的導出模塊... 1

2.2、 建立組件入口文件... 1

2.3、 配置“ng-package.json”文件... 1

2.4、 配置package.json文件... 2

2.5、 復制git地址... 3

2.6、 配置Jenkins. 3

2.6.1、 新建項目... 3

2.6.2、 確定名稱和項目類型... 3

2.6.3、 填寫項目描述和地址... 4

2.6.4、 選擇SDK.. 4

2.6.5、 填寫代碼地址... 5

2.6.6、 選擇node版本... 5

2.6.7、 添加shell 6

2.6.8、 填寫shell命令... 6

2.6.9、 發布到npmjs公共組件庫... 8

2.6.10、 身份驗證... 8

2.6.11、 保存配置... 9

3、 構建... 9

3.1.1、 構建項目... 9

3.1.2、 查看進度... 10

3.1.3、 查看詳情... 10

4、 常見構建錯誤... 11

4.1.1、 未修改“private”狀態... 11

4.1.2、 無法安裝依賴包... 12

4.1.3、 堆棧調用超出數量限制... 12

4.1.4、 目標倉庫地址返回404. 12

5、 案例... 12

6、 參考... 12

 

 

 

 

1、 前言

當前前端項目都是用組件化、模塊化的方式進行開發,每個項目都會用到若干公共或私有的組件和模塊。對於項目高頻使用的組件,有必要進行獨立封裝並發布到公司內部組件庫,以提高代碼的可復用性以及加快項目的開發進度。

本文講述了基於node的前端angular組件通過Jenkins平台打包、發布至nexus倉庫管理平台的流程、配置和常見問題及其分析和解決方案。

2、 配置

前端組件開發完成后,需做適當配置才能發布到nexus。

2.1、 建立組件的導出模塊

在node環境進入組件目錄,用以下命令創建一個模塊(名稱與組件保持一致):

ng generate module MyCompModule –flat

 

然后編輯該文件,導入和導出相應組件,代碼如下:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
  
import { MyCompComponent } from "./my-comp.component";
  
@NgModule({
  declarations: [MyCompComponent],
  imports: [
    CommonModule
  ],
  exports: [
    MyCompComponent
  ]
})
export class MyCompModule { }

 

2.2、 建立組件入口文件

在項目根目錄建立“public_api.ts”文件,用於導出組件的模塊,內容如下: 

export * from './src/app/component/my-comp.module';

 

2.3、 配置“ng-package.json”文件

打包組件時,需要在“ng-package.json”文件指定入口文件以及依賴白名單,內容如下:

{
    "$schema": "./node_modules/ng-packagr/ng-package.schema.json",
    "lib": {
      "entryFile": "public_api.ts"
    },
    "whitelistedNonPeerDependencies": [
      "."
    ]
}

 

其中,“entryFile”即前面建立的入口文件“public_api.ts”;

“whitelistedNonPeerDependencies”是白名單列表(數組),元素為不在“peerDependencies”列表的依賴包,可以寫完整的包名,比如“@angular/core”或只寫“angular”,這將作為正則表達式匹配所有包含“angular”的包名。如果要禁用該特性,則只需包含一個“.”元素。

2.4、 配置package.json文件

打開項目根目錄的“package.json”文件,刪除“dependencies”節點,或將“dependencies”改成“peerDependencies”,設置好“name”等屬性,其中“private”屬性必須設置為“false”,在“scripts”節點配置“packagr”腳本“"packagr": "ng-packagr -p ng-package.json"”,如下代碼所示:

{
    "name": "component-demo",
    "version": "0.1.0",
    "description": "Component demo",
    "author": "Jaffray",
    "private": false,
    "scripts": {
      "ng": "ng",
      "start": "ng serve --open --port 8082",
      "build": "ng build",
      "test": "ng test",
      "lint": "ng lint",
      "e2e": "ng e2e",
      "packagr": "ng-packagr -p ng-package.json"
    },
    //...
}

 

其中,刪除“dependencies”節點,或將“dependencies”改成“peerDependencies”,是因為打包組件或庫不能同時把所依賴的包也一並打包發布。

做好上述配置即可在node環境執行以下進行打包、發布了:

npm run packagr
cd dist
npm pack
npm publish

 

接下來將代碼提交到 git 代碼倉庫,然后移步 Jenkins 平台。

2.5、 復制git地址

將項目代碼push到git后,復制git地址並打開Jenkins平台進行配置和發布。

打開項目的“Project”選項卡頁面,分別復制瀏覽器地址欄的地址(Project URL)和箭頭指示處的代碼倉庫地址(Repository URL),如下圖所示。點擊代碼倉庫地址右邊的小圖標可以直接復制該地址:

2.6、 配置Jenkins

2.6.1、 新建項目

在Jenkins平台首頁點擊“New Item”新建項目:

2.6.2、 確定名稱和項目類型

填寫項目名稱,選“Freestyle project”,然后點“OK”按鈕完成新建項目:

2.6.3、 填寫項目描述和地址

在“General”選項卡頁面填寫“Description”,勾選“Github Project”,把之前復制好的項目git地址粘貼到“Project url”右邊的文本框內:

2.6.4、 選擇SDK

由於前端項目並不會用到JDK,因此JDK項目選擇“System”即可:

2.6.5、 填寫代碼地址

在“Source Code Management”選項卡頁面選中“Git”,填入“Repository URL”,“Credentials”選擇能通過驗證的賬號,“Branches to build”填入用於Jenkins發布的分支,比如“develop”或“master”。

“Repository browser”選擇“github”,URL填“gitlab@”和去掉“http://”部分的git repository url,“version”填“1.0”即可:

2.6.6、 選擇node版本

在“Build Enviroment”選項卡頁面勾選“Provide Node & npm/bin/ folder to PATH”,“NodeJS Installation”選擇與項目開發相匹配的版本,比如“NodeJS10/11”,“npmrc file”選擇“-use system default-”:

2.6.7、 添加shell

在“Build”選項卡頁面點擊“Add build step”,點擊彈出菜單的“Execute shell”:

2.6.8、 填寫shell命令

在“Execute shell”的“Command”文本框內填入構建和發布的相關指令:

為了便於在構建日志中查看node和npm的版本、配置以及“package.json”等配置文件內容,可以寫入如下指令: 

node -v
npm -v
npm config list
cat package.json
cat ng-package.json

 

由於配置“package.json”時已經把“dependencies”節點刪除或改名,Jenkins又不會安裝“peerDependencies”節點標記的依賴包,因此需要手動寫命令安裝依賴包:

npm install @angular/animations@7.2.0
npm install @angular/common@7.2.0
npm install @angular/compiler@7.2.0
npm install @angular/core@7.2.0
npm install @angular/forms@7.2.0
npm install @angular/platform-browser@7.2.0
npm install @angular/platform-browser-dynamic@7.2.0
npm install @angular/router@7.2.0
npm install core-js@2.5.4
npm install echarts@4.1.0
npm install ng-packagr@4.7.0
npm install ngx-echarts@4.1.0
npm install rxjs@6.3.3
npm install tsickle@0.34.3
npm install tslib@1.9.0
npm install zone.js@0.8.26
npm install npm-login-cmd

 

指定依賴包版本時需要將版本號寫在包名后面,用“@”間隔。另外,“npm-login-cmd”是用於客戶端登錄,如果服務端配置了驗證信息,就不需要安裝這個插件。

安裝好依賴就可以執行以下命令打包了:

npm run packagr
cd dist
npm pack

 

之后就可以publish了。Publish時可以通過“registry”參數指定發布目標倉庫,如果不指定,則發布到npm的全局配置“registry”所設定的目標,默認是https://registry.npmjs.org

npm publish --registry http://192.168.x.y:z/my-repository/

 

如果之前已經設置過全局“registry”,則不需要“--registry”參數:

npm publish

 

2.6.9、 發布到 npmjs 公共組件庫

類似發布到內部庫,要發布組件到npmjs公共組件庫,只需要將全局registry設置為“https://registry.npmjs.org”,或者在“npm publish”命令后面指定參數“--registry https://registry.npmjs.org”即可。

2.6.10、 身份驗證

Publish項目需要通過目標的身份驗證。身份驗證有兩種方法:服務端配置驗證信息和客戶端提交驗證信息。

  • 服務端配置驗證信息

編輯“.npmrc”文件,增加或修改“registry”、“email”、“_auth”以及“always-auth”:

_auth=***
registry=http://192.168.x.y:z/my-repository/
email=***@***.com
always-auth=true

 

其中,“_auth”是用冒號間隔用戶名和密碼組成的字符串的base64方法編碼結果,即:

_auth = base64Encode(<username>:<password>)

 

“registry”是用上述信息來驗證的目標倉庫地址;

“email”是用於驗證的郵箱地址,該郵箱與上述由於驗證的用戶、密碼相關。

  • 客戶端提交驗證信息

如果需要在客戶端提交登錄信息,則需要在“publish”命令前執行以下命令:

export NPM_USER=<YOUR USERNAME>
export NPM_PASS=<YOUR PASSWORD>
export NPM_EMAIL=<YOUR EMAIL>
npm config set registry http://192.168.x.y:z/my-repository/
npx npm-login-cmd

 

如下圖:

其中,“npx npm-login-cmd”表示用“npm-login-cmd”插件來實現在自動化環境非交互性登錄,其原理是使用子進程監測“stdout”,當監測到“username”、“password”和“email”等關鍵字時就在“stdin”寫入對應的信息。

2.6.11、 保存配置

配置完畢,點擊當前頁面左下角的“Save”或“Apply”按鈕即可保存配置。其中,點擊“Apply”按鈕會繼續停留在當前頁面等待進一步修改配置;點擊“Save”按鈕則回到當前Jenkins項目的首頁,可以進行構建等操作。如下圖:

3、 構建

3.1.1、 構建項目

在Jenkins項目的首頁,點擊左側菜單中的“Build Now”即可對項目進行構建。如下如:

3.1.2、 查看進度

在“Build History”區域將出現當前項目的構建進度:

3.1.3、 查看詳情

點擊編號,即可查看本次構建詳情:

其中,編號左側的藍色圓球圖標表示構建成功,紅色圓球圖標表示構建失敗;點擊左側“Changes”鏈接可以查看代碼變更詳情;點擊“Console Output”可以查看構建過程中腳本執行日志,如果腳本執行出錯,可以根據日志做相應修改並重新構建。如下圖:

4、 常見構建錯誤

4.1.1、 未修改“private”狀態

錯誤信息:This package has been marked as private

問題分析:用npm命令創建前端項目時,由於“package.json”文件中的“private”默認為“true”,提交代碼時往往忘記改變該值。

解決方案:編輯“package.json”文件,將“private”設為“false”即可。

4.1.2、 無法安裝依賴包

錯誤信息:404 Not Found: @types/echarts@^4.1.3

問題分析:可能是registry設置不當

解決方案:將registry設置為npmjs或淘寶的registry。比如:

npm config set registry https://registry.npmjs.org

 

4.1.3、 堆棧調用超出數量限制

錯誤信息:Maximum call stack size exceeded

問題分析:包的依賴關系比較復雜,當網絡狀況不佳出現該問題。

解決方案:設置registry為淘寶的registry。比如:

npm config set registry https://registry.npm.taobao.org

 

4.1.4、 目標倉庫地址返回404

錯誤信息:npm ERR! code E404, npm ERR! 404 Registry returned 404 for PUT on http://192.168.x.y:z/repository

問題分析:設置全局registry時URL不正確。私有庫地址一般包含路徑,URL結尾需要帶上斜線“/”。

解決方案:設置正確的registry。比如:

npm config set registry http://192.168.x.y:z/repository/

 

5、 案例

http://192.168.x.y:z/jenkins/job/x-angular-components/

6、 參考

https://www.npmjs.com/package/npm-auth

https://help.sonatype.com/repomanager2/node-packaged-modules-and-npm-registries

https://stackoverflow.com/questions/35043155/how-should-i-set-auth-in-npmrc-when-using-a-nexus-https-npm-registry-proxy

https://blog.csdn.net/m0_37729058/article/details/86150970


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM