NPM包(模組)釋出、更新、撤銷釋出

william_zhou發表於2019-01-29

在開始之前,先去註冊一個NPM賬號,如果沒有的話

◈ 釋出NPM公開包

♢ 建立專案

  1. 建專案資料夾
    先建一個工程資料夾或者拉取遠端git上的已有專案

    mkdir my-test-project
    複製程式碼
  2. 初始化git
    進入該資料夾,先初始化git(如果還沒有的話),用於版本控制。在github(也可以其他)上新建一個與專案同名的遠端倉庫,並新增README.md檔案,拷貝倉庫地址,如:

    // 拷貝github上的倉庫地址
    git@github.com:username/my-test-project.git
    
    git init
    git remote add origin git@github.com:usename//my-test-project.git
    git push -u origin master
    複製程式碼

    這樣就把本地倉庫和遠端倉庫關聯起來了

  3. 初始化npm
    在專案根目錄下即my-test-project目錄下執行,npm init,然後根據提示填寫相關資訊,有些可以略過後續修改。
    要注意的是name欄位,有幾個點要提醒:

    • 這個是唯一的,不能和npm上所有已有的包重名,否則在publish的時候回會提示許可權錯誤
      npm ERR! You do not have permission to publish "my-test-project". 
      Are you logged in as the correct user? : my-test-project
      複製程式碼
    • 另外命名也有規範,不能出現下劃線、大寫字母、空格等字元,可以有連字元(中劃線)
    • 先建立index.js檔案,作為測試,在裡面寫幾行簡單程式碼,並export一個預設變數

♢ 釋出

  1. 先登入npm使用者,執行

    npm adduser // or npm login
    Username: npm-user-name
    Password:
    Email: your-email
    複製程式碼

    根據提示輸入正確的npm使用者名稱、密碼、郵箱,新增完後會預設登入

  2. 執行

    npm publish
    複製程式碼

    如果沒什麼問題,應該就釋出成功了。可以去npm搜尋釋出的包: my-test-project,或者去自己的npm賬號下檢視package

♢ 關於測試

  1. publish前測試
    在npm init 完成之後,就可以作為一個依賴包供其他模組引用。根據上面的例子,把my-test-project資料夾放入另外的測試工程node_modules資料夾下面,這樣就可以跟引入其他模組一樣,引入之前在index.js裡面export的測試變數,如

    // my-test-project 下的index.js
    const a = `this is a test`
    export default a // or module.exports = a
    
    // 引用
    import a from `my-test-project` // or const a = require(`my-test-project`)
    複製程式碼

    建議先測試完,沒有問題再publish

  2. publish後測試是否有問題
    publish後就更好辦了,直接像安裝其他模組一樣通過npm i 命令安裝,然後引用

◈ 更新已釋出的包

更新包和釋出包的命令是一樣的,更新包只需修改package.json裡面的version欄位,也可以使用npm 自帶的版本控制命令修改版本號,更新的步驟為:

  1. 修改版本號
  2. npm publish

♢ npm version

npm 提供官方提供了npm version來進行版本控制,其效果跟手動修改package.json裡面的version欄位是一樣的,好處在於,可以在構建過程中用npm version命令自動修改,而且具有語義化即Semantic versioning.

npm version [<newversion> | major | minor | patch | premajor | preminor | 
prepatch | prerelease | from-git]
複製程式碼

其語義為:

major:主版本號(大版本)
minor:次版本號(小更新)
patch:補丁號(補丁)
premajor:預備主版本
preminor: 預備次版本
prepatch:預備補丁版本
prerelease:預釋出版本
複製程式碼

如初始版本為 1.0.0,執行相關型別命令後,對應的語意為:

npm version patch  // 1.0.1 表示小的bug修復
npm version minor // 1.1.0 表示新增一些小功能
npm version mmajor // 2.0.0 表示大的版本或大升級
npm version preminor // 1.1.0-0 後面多了個0,表示預釋出
複製程式碼

可以在當前模組的package.json裡面看到相應的版本變化

◈ 撤銷釋出

由於撤銷釋出會讓把要撤銷的包作為依賴的包不能正常工作,所以npm官方對包的撤銷是有限制的:

  1. 不允許撤銷釋出已經超過24小時的包(unpublish is only allowed with versions published in the last 24 hours
  2. 如果在24小時內確實要撤銷,需要加–force引數
  3. 即使撤銷了釋出的包,再次釋出的時候也不能與之前被撤銷的包的名稱/版本其中之一相同,因為這兩者構成的唯一性已經被佔用,官方並沒有隨著撤銷而刪除

♢ npm unpublish

撤銷釋出的命令為 npm unpublish

npm unpublish my-test-project
// 報錯
npm ERR! Refusing to delete entire project.
npm ERR! Run with --force to do this.
npm ERR! npm unpublish [<@scope>/]<pkg>[@<version>]

// 加 --force引數重新撤銷釋出
npm unpublish my-test-project --force
npm WARN using --force I sure hope you know what you are doing.
- my-test-project
複製程式碼

♢ npm deprecate

npm unpublish的推薦替代命令:

npm deprecate <pkg>[@<version>] <message>
複製程式碼

這個命令,並不會在npm上裡撤銷已有的包,但會在任何人嘗試安裝這個包的時候得到deprecated的警告,例如:

npm deprecate my-test-project `this package is no longer maintained`
複製程式碼

參考:

相關文章