npm入門(二)—package(包)的管理

前言

上一篇 npm入門(一)—瞭解基本組成與概念 簡單介紹了一下npm的相關知識,這篇能夠說是npm的核心知識。css

分類

關於pacakge,是有分爲public pacakge(公共包)、private pacakge(私有包)。前面咱們也知道npm帳號也有兩種,一直的免費用戶,一個是付費用戶。私有包是付費用戶才能發佈的。html

直觀地,在npn website上看,package前面會有個標籤標註該包是公有的仍是私有的vue

scopes

在此以前,咱們先了解這麼一個概念——scopes(中文意思是做用域)。咱們在註冊npm帳號和建立組織時,你將被授予一個與你的用戶或組織名稱匹配的範圍,即你得到了一個適用範圍(scope),這個範圍是你的用戶名或者建立的組織名。你能夠將此範圍用做相關包的命名空間。如你有一個package名叫mypackage,你的用戶名爲myusername,則你能夠把這個package放到你的域裏node

@myusername/mypackage
複製代碼

這樣有什麼做用呢?jquery

  1. 避免與別人的包重名,發生衝突。
  2. 限制該包的訪問權限。假設你是付費用戶,想要建立一個私有包,那麼能夠在你的域裏受權哪些用戶才能訪問

public package

默認地,若是咱們不對registry進行了任何設置,那麼發佈的包就是基於默認的registry(http://registry.npmjs.org)的,發佈出來的包是公共的,任何人均可以訪問使用。webpack

public package也有兩種:git

  • unscoped package:這個就是普通的共用包了,沒有指定範圍
  • scoped package:這個是在劃分了範圍的包,默認是私有的,可是手動轉化爲共有的。

private package

私有包,只有付費用戶才能建立。私有包,是指只有受權用戶才能進行下載發佈等管理,並且還能指定各類權限,例如只讀只寫之類的。github

私有包確定是指定了範圍的(scoped),默認地,指定了範圍的包都是私有包(固然後面能夠手動更改)web

私有包能夠劃分兩種vue-router

  • 用戶範圍的私有包:只能由你和你授予讀或讀/寫訪問權限的協做者訪問。
  • org(組織)範圍的私有包:只能被授予讀或讀/寫訪問權限的團隊訪問。

包類型的轉換

上面咱們知道包的一些分類,那麼,如何在須要時改變它們的類型呢?

公有轉私有

在npm website上操做的方法就不說了,直接說敲命令的方式:

npm access restricted <pacakge-name>
複製代碼

<pacakge-name>替換爲真實包名

私有轉公有

在npm website上操做的方法就不說了,直接說敲命令的方式:

npm access public <pacakge-name>
複製代碼

<pacakge-name>替換爲真實包名

須要注意的是,只有是付費用戶才能轉爲私有。

私有包受權用戶

私有包有時候爲了協做,須要添加其餘開發者進行一塊兒管理,因此須要把私有包受權給某些用戶。根據私有包類型

用戶私有包

在npm website上操做的方法就不說了,直接說敲命令的方式:

npm owner add <user> <your-package-name>
複製代碼

組織私有包

要授予npm用戶對私有組織包的訪問權,您必須有一個組織全部者將它們添加到您的組織中,而後將它們添加到有權訪問私有包的團隊中。具體步驟參考 這裏


建立package

說了那麼多,是時候應該知道,如何建立一個package了。

進入你想要建立package的文件夾根目錄中,運行如下命令

npm init
複製代碼

進行npm項目(package)的初始化,當運行這個命令後,會出現一個問卷,例如問你項目的名稱,做者,描述等信息,你按照實際狀況輸入迴應便可。填完問卷後,會在該目錄下生成一個package.json文件,該文件裏包含剛回應問卷的一些信息。

若是你懶得一個個迴應,可使用默認的狀況,運行

npm init --y 或者 npm init --yes
複製代碼

這樣會自動根據你當前目錄的狀況,生成一系列默認信息在package.json文件。

固然咱們也能夠設置一些init時的固定指定信息,如

npm set init.author.name xxxx
npm set init.author.email xxxx
複製代碼

這裏就設定了init時固定做者信息是啥

若是你想建立的是指定域的包,那麼運行

npm init --scope=@yourscopename
複製代碼

yourscopename替換成你想要起的域的名稱

package.json

上一篇咱們說過,package是由一個package.json文件描述組織起來的,因此這個文件相當重要。先大概看一下這個文件長哪樣

{
  "name": "xxxx",
  "version": "1.0.0",
  "description": "xxx",
  "author": "myname <myname@xxx.com>",
  "private": true,
  "scripts": {
    "dev": "concurrently \"webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --env.sysName=eod\" \"node mock-server.js\""
  },
  "dependencies": {
    "vue-router": "3.0.1"
  },
  "devDependencies": {
    "autoprefixer": "7.1.2"
  },
  ...
}

複製代碼

挑了些經常使用常見的內容展現出來。

屬性 描述
name 必需。package的名稱
version 必需。package的版本,遵循semantic versioning spec(語義版本控制規範)
description 推薦。用來描述你的package的一些信息,方便別人在npm website上查找你的pacakge
author 做者的相關信息。格式Your Name <email@example.com> (http://example.com)。包含了你的名稱、郵箱和博客之類的網址,不必定要全寫
private 你的package是私有的仍是公有的
scripts 一些npm腳本,造成npm指令,方便你進行某些工做,如構建
dependencies 這是你的package發佈後,羅列的所須要依賴的一些別人的package,缺少了這些package,你的package也會不能如期正常工做
devDependencies 這裏是羅列你在開發過程當中所依賴的一些package,爲了方便你的開發所用的包,缺乏他們也不會影響到你的包發佈後的正常使用,就放在這裏了。

做用

  1. 從文件裏能看出,該包的一些基礎信息,以及所依賴的一些包
  2. 能看出所依賴的包的一些版本信息
  3. 使你的構建具備可重複性,所以更容易與其餘開發人員共享

README.md

顧名思義,這個至關於用該package以前先看它的意思,即便用手冊之類的意思。通常地,推薦package包含這個文件比較好,方便用戶使用你的包。這個文件是使用markdown語法

此文件只有在發佈包的新版本時纔會在包頁面上更新。

發佈package

發佈package以前,要好好檢查你的文件裏是否包含某些私人信息,敏感信息。請注意刪除或者發佈時忽略掉。使用.npmignore.gitignore文件來忽略掉,詳情見

發佈包命令:

npm publish
複製代碼
  1. 若是要發佈一個未指定域的公用包,直接運行上述命令便可。
  2. 若是要發佈一個指定域的私有包,直接運行上述命令便可(默認指定域是私有包)。須要注意的是,publish以前要注意npm所在registry,如你要發佈到公司的registry裏,則發佈前須要切換到公司registry下,才運行該命令,例如使用上一篇提到的npmrc工具
  3. 若是要發佈一個指定域的私有包進行公有化,運行
npm publish --access public
複製代碼

pacakge的版本控制規範

一個package必定要指定某個版本,而爲了規範網絡上你們各類各樣的package,方便你們交流共享等,就制定了一個版本控制規範,你們在給本身package指定版本/更新版本的時候就好好考慮版本號了。

以當前版本爲1.0.0爲例子,遵循如下規範:

更新狀況 位置 version
修復當前版本的一些bug 第三位 1.0.1
新增向後兼容的新特性 第二位 1.1.0
進行了破壞性地沒法向後兼容的更改 第一位 2.0.0

在package.json裏,咱們看到依賴項裏,包的版本信息裏會出現^~符號。這裏要知道這些符號表明什麼意思。例如

"eslint": "^3.19.0",
"css-loader": "~3.19.0",
複製代碼

表明安裝這個包的版本信息是浮動的,而不是指定死版本。

  • ^表明固定主版本號的,其他號浮動,如^1.3.0,高於等於1.3.0,1.x.x都符合,可是要低於2.0.0

  • ~表明固定次版本號的,修訂號浮動,如~1.3.0,高於等於1.3.0,1.3.x都符合,可是要低於1.4.0

爲package打tag

雖然package已經有版本號做爲一些信息反饋給用戶,可是語義化不夠,不夠直觀明瞭,所以能夠爲package加上tag,即標籤,爲其備註一些信息,讓用戶更淺顯易懂點。如運行

npm publish --tag beta
複製代碼

在發佈時,就爲package打上了beta標籤了。

默認地,發佈時會自動繼承這個包上次發佈的標籤的信息,如上次打了個beta標籤,後面直接運行npm publish時,也會自動應用上beta標籤。

須要注意的是,tag名儘可能不要使用數字或者v(不論大小寫)開頭的名字,由於tag的命名空間和版本號是一塊兒的,會發生衝突。

若是想要指定版本進行打標籤,運行

npm dist-tag add <packagename>@<version> tagname
複製代碼

npm dist-tag add vue@1.2.0 beta
複製代碼

發佈後對於package的管理

更新版本

當你在維護一個包時,免不得了在調整以後須要對版本進行改變,以告知使用你的包的人,運行如下命令進行更新版本並進行發佈

npm version <new-version>
npm publish
複製代碼

棄用與取消棄用package

棄用

當你再也不想維護一個package,你須要告知那些依賴了你的包的人,讓他們知道你的這個包你再也不進行維護了,這是出於你的責任心啦。運行

npm deprecate <package-name> 'message'
複製代碼

這裏的message就是你須要告知別人你的一些關於棄用的消息,這裏必定要帶上這個消息哦,否則就是另外一個含義了。

若是你只想棄用某個版本,而不是整個package,運行

npm deprecate <package-name>@<version> 'message'
複製代碼

注意:棄用以後別人在npm的網站上會搜不出你的包來哦。訪問你的包的網頁也會有標識表名你的包給棄用了。別人在安裝你的包時也會出現棄用的消息

取消棄用

若是往後你又回心轉意了,想繼續維護這個包,那麼你就能夠取消棄用了。運行

npm deprecate <package-name> ''
複製代碼

你們留意到嗎,這裏跟棄用的命令很像,惟一的區別在於,以前的message替換成'',這樣就能夠取消棄用了

轉移package

若是你不想維護你的包了,你能夠選擇棄用,也能夠選擇轉移你的包,但願它再找個主人吧。你能夠把你的包轉移給@npm,運行

npm owner add npm <package-name>
npm owner rm <user> <package-name>
複製代碼

上面的兩句命令就是,爲你的package添加受權給npm,而後刪除你對該包的擁有權。<user>爲你的帳號名

因此,當轉移了包以後,你就沒了對它的使用權了,也不能更新它。

取消發佈

發佈了一個包以後,若是往後你不想讓它再出現了,又不想僅是標誌棄用,那麼能夠選擇取消這個包的發佈。固然這個行爲可能會對別人產生很差的影響,例如別人依賴你的包,你無聲無息地把這個包給取消掉了,叫別人情何以堪。

當你發佈了一個公共package以後,72小時內後悔了,能夠運行

npm unpublish <package-name> -f
複製代碼

若是你僅想取消某個版本,運行

npm publish <package-name>@<version>
複製代碼

若是是72小時後,那麼須要聯繫 npm support了。若是你想取消的是一個組織包,非我的包,那麼須要聯繫 enterprise@npmjs.com

安裝package

咱們已經瞭解過了pacakge的基本狀況,知道從他的建立到發佈,到發佈後的管理。都是從自身做爲包的擁有者角度去處理包,那麼如今是時候做爲一名使用者角度,知道如何使用別人的包了。

使用別人的包,首先就得安裝下載他們的包,安裝分爲兩類:

  • local install (本地安裝)
  • global install (全局安裝)

本地安裝

例如在你的某個項目中,須要使用到別人的一些包,那麼須要在你這個項目下下載安裝所需的包,下載下來的包只會在該項目中被引用。

換個思路去理解,就是像好久之前開發一個項目,須要引入某個類庫,如jquery,那麼就下載jquery.min.js,放在項目裏某個文件夾裏,而後在適當的位置引入它來進行使用,如在index.html裏經過script標籤進行引用。這樣的話,其實這個jquery.min.js只會在這個項目裏被引入使用,而不能在第二個項目B中被引用,由於它是被放在項目A裏面了,這種就是本地安裝

運行如下命令進行本地安裝:

npm install 
複製代碼

會依據項目中的package.json文件的依賴項以及聲明的semver規則的最新版原本進行安裝對應的包。若是該項目裏沒有node_modules文件夾,那麼會新建一個,裏面內容就是安裝的package代碼,若是有,那麼直接在這個文件夾下新增pacakge

若是想要安裝指定某個包(私有包請帶上@域名/),運行

npm install <package-name>
複製代碼

若是項目裏沒有package.json文件,那麼會下載指定包的最新版本,若是存在,會下載package.json中聲明的semver規則的最新版本。

若是想要指定依賴的類型(dependencies, devDependencies等)

npm install <package-name> --save
複製代碼

加上--save是指該package是生產依賴項,存放在package.jsondependencies裏,其實這是個默認的行爲,即就算不加上--save,默認也是放在dependencies裏。

若是想放在開發依賴裏,運行

npm install <package-name> --save-dev
複製代碼

若是想要安裝指定版本或者tag的包,運行

npm install <package-name>@<version>
npm install <package-name> <tag>
複製代碼

須要注意的是,若是是指定了某個tag的package進行安裝,那麼下載安裝若是不帶上tag,會自動默認依據上次的tag信息進行安裝,例如,

npm install loadash beta
複製代碼

下次安裝loadash的時候,默認是下載beta標籤的loadash

全局安裝

全局安裝,就是指安裝一些共用的包,在你的本地計算機下的項目,都能共用這些包。例如npm了,每一個項目都須要使用npm,那麼全局安裝就行了,沒必要要每一個項目都獨立安裝一遍。指令也很簡單

npm install -g
npm install -g <package-name>
複製代碼

其實跟本地安裝介紹的意思是同樣的,只不過區別就在於,多了個-g來標記是全局安裝

更新package

隨着時間的變化,可能你本地下載的包已是比較老的了,須要更新一下別人的包,那麼在項目根目錄下運行

npm update
複製代碼

便可更新package.json裏羅列的包。

若是想單獨更新某個包(私有包請帶上@域名/),運行

npm update <package-name>
複製代碼

一樣地,若是想更新全局的包,也是加個-g便可,如

npm update -g
複製代碼

若是想看看當前項目裏有哪些過期的包,能夠運行

npm outdated
複製代碼

會顯示當前有哪些包過期了。固然這也能夠用來檢驗是否更新成功了

若是想看看有哪些過期的全局包,運行

npm outdated -g --depth=0
複製代碼

取消安裝/刪除package

若是某個包你不想要了,爲了節省空間以及協做時避免別人下載一些沒必要要的資源,能夠刪除某些不須要的包。運行(私有包請帶上@域名/

npm uninstall <package-name>
複製代碼

指定刪除某個包

npm uninstall -g <package-name>
複製代碼

指定刪除某個全局包

相關文章
相關標籤/搜索