天天看點

npm 使用過程中報錯問題-及npm使用

原文位址:https://blog.csdn.net/u013022210/article/details/77740519

1.以下為報錯具體詳情;node 8.1.2 版本問題:其他空間安裝成功但是安裝webpack 總是報以下錯誤:解決辦法為重新安裝node

2.

npm子產品管理器

來自《JavaScript 标準參考教程(alpha)》,by 阮一峰

目錄

  • 簡介
  • npm init
  • npm set
  • npm config
  • npm info
  • npm search
  • npm list
  • npm install
  • 基本用法
  • 安裝不同版本
  • 避免系統權限
  • npm update,npm uninstall
  • npm run
  • 參數
  • scripts腳本指令最佳實踐
  • pre- 和 post- 腳本
  • 内部變量
  • 通配符
  • npm link
  • npm bin
  • npm adduser
  • npm publish
  • npm deprecate
  • npm owner
  • 其他指令
  • npm home,npm repo
  • npm outdated
  • npm prune
  • npm shrinkwrap
  • 參考連結

npm

有兩層含義。一層含義是Node的開放式子產品登記和管理系統,網址為npmjs.org。另一層含義是Node預設的子產品管理器,是一個指令行下的軟體,用來安裝和管理Node子產品。

npm

不需要單獨安裝。在安裝Node的時候,會連帶一起安裝

npm

。但是,Node附帶的

npm

可能不是最新版本,最好用下面的指令,更新到最新版本。

$ npm install npm@latest -g
           

上面的指令中,

@latest

表示最新版本,

-g

表示全局安裝。是以,指令的主幹是

npm install npm

,也就是使用

npm

安裝自己。之是以可以這樣,是因為

npm

本身與Node的其他子產品沒有差別。

然後,運作下面的指令,檢視各種資訊。

# 檢視 npm 指令清單
$ npm help

# 檢視各個指令的簡單用法
$ npm -l

# 檢視 npm 的版本
$ npm -v

# 檢視 npm 的配置
$ npm config list -l
           

npm init

用來初始化生成一個新的

package.json

檔案。它會向使用者提問一系列問題,如果你覺得不用修改預設配置,一路回車就可以了。

如果使用了

-f

(代表force)、

-y

(代表yes),則跳過提問階段,直接生成一個新的

package.json

檔案。

$ npm init -y
           

npm set

用來設定環境變量。

$ npm set init-author-name 'Your name'
$ npm set init-author-email 'Your email'
$ npm set init-author-url 'http://yourdomain.com'
$ npm set init-license 'MIT'
           

上面指令等于為

npm init

設定了預設值,以後執行

npm init

的時候,

package.json

的作者姓名、郵件、首頁、許可證字段就會自動寫入預設的值。這些資訊會存放在使用者主目錄的

~/.npmrc

檔案,使得使用者不用每個項目都輸入。如果某個項目有不同的設定,可以針對該項目運作

npm config

$ npm set save-exact true
           

上面指令設定加入子產品時,

package.json

将記錄子產品的确切版本,而不是一個可選的版本範圍。

$ npm config set prefix $dir
           

上面的指令将指定的

$dir

目錄,設為子產品的全局安裝目錄。如果目前有這個目錄的寫權限,那麼運作

npm install

的時候,就不再需要

sudo

指令授權了。

$ npm config set save-prefix ~
           

上面的指令使得

npm install --save

npm install --save-dev

安裝新子產品時,允許的版本範圍從克拉符号(

^

)改成波浪号(

~

),即從允許小版本更新,變成隻允許更新檔包的更新。

$ npm config set init.author.name $name
$ npm config set init.author.email $email
           

上面指令指定使用

npm init

時,生成的

package.json

檔案的字段預設值。

npm info

指令可以檢視每個子產品的具體資訊。比如,檢視underscore子產品的資訊。

$ npm info underscore
{ name: 'underscore',
  description: 'JavaScript\'s functional programming helper library.',
  'dist-tags': { latest: '1.5.2', stable: '1.5.2' },
  repository:
   { type: 'git',
     url: 'git://github.com/jashkenas/underscore.git' },
  homepage: 'http://underscorejs.org',
  main: 'underscore.js',
  version: '1.5.2',
  devDependencies: { phantomjs: '1.9.0-1' },
  licenses:
   { type: 'MIT',
     url: 'https://raw.github.com/jashkenas/underscore/master/LICENSE' },
  files:
   [ 'underscore.js',
     'underscore-min.js',
     'LICENSE' ],
  readmeFilename: 'README.md'}
           

上面指令傳回一個JavaScript對象,包含了underscore子產品的詳細資訊。這個對象的每個成員,都可以直接從info指令查詢。

$ npm info underscore description
JavaScript's functional programming helper library.

$ npm info underscore homepage
http://underscorejs.org

$ npm info underscore version
1.5.2
           

npm search

指令用于搜尋npm倉庫,它後面可以跟字元串,也可以跟正規表達式。

$ npm search <搜尋詞>
           

下面是一個例子。

$ npm search node-gyp
// NAME                  DESCRIPTION
// autogypi              Autogypi handles dependencies for node-gyp projects.
// grunt-node-gyp        Run node-gyp commands from Grunt.
// gyp-io                Temporary solution to let node-gyp run `rebuild` under…
// ...
           

npm list

指令以樹型結構列出目前項目安裝的所有子產品,以及它們依賴的子產品。

$ npm list
           

加上global參數,會列出全局安裝的子產品。

$ npm list -global
           

npm list

指令也可以列出單個子產品。

$ npm list underscore
           

Node子產品采用

npm install

指令安裝。

每個子產品可以“全局安裝”,也可以“本地安裝”。“全局安裝”指的是将一個子產品安裝到系統目錄中,各個項目都可以調用。一般來說,全局安裝隻适用于工具子產品,比如

eslint

gulp

。“本地安裝”指的是将一個子產品下載下傳到目前項目的

node_modules

子目錄,然後隻有在項目目錄之中,才能調用這個子產品。

# 本地安裝
$ npm install <package name>

# 全局安裝
$ sudo npm install -global <package name>
$ sudo npm install -g <package name>
           

npm install

也支援直接輸入Github代碼庫位址。

$ npm install git://github.com/package/path.git
$ npm install git://github.com/package/path.git#0.1.0
           

安裝之前,

npm install

會先檢查,

node_modules

目錄之中是否已經存在指定子產品。如果存在,就不再重新安裝了,即使遠端倉庫已經有了一個新版本,也是如此。

如果你希望,一個子產品不管是否安裝過,npm 都要強制重新安裝,可以使用

-f

--force

參數。

$ npm install <packageName> --force
           

如果你希望,所有子產品都要強制重新安裝,那就删除

node_modules

目錄,重新執行

npm install

$ rm -rf node_modules
$ npm install
           

install指令總是安裝子產品的最新版本,如果要安裝子產品的特定版本,可以在子產品名後面加上@和版本号。

$ npm install sax@latest
$ npm install [email protected]
$ npm install sax@">=0.1.0 <0.2.0"
           

如果使用

--save-exact

參數,會在package.json檔案指定安裝子產品的确切版本。

$ npm install readable-stream --save --save-exact
           

install指令可以使用不同參數,指定所安裝的子產品屬于哪一種性質的依賴關系,即出現在packages.json檔案的哪一項中。

  • –save:子產品名将被添加到dependencies,可以簡化為參數

    -S

  • –save-dev: 子產品名将被添加到devDependencies,可以簡化為參數

    -D

$ npm install sax --save
$ npm install node-tap --save-dev
# 或者
$ npm install sax -S
$ npm install node-tap -D
           

如果要安裝beta版本的子產品,需要使用下面的指令。

# 安裝最新的beta版
$ npm install <module-name>@beta (latest beta)

# 安裝指定的beta版
$ npm install <module-name>@1.3.1-beta.3
           

npm install

預設會安裝

dependencies

字段和

devDependencies

字段中的所有子產品,如果使用

--production

參數,可以隻安裝

dependencies

字段的子產品。

$ npm install --production
# 或者
$ NODE_ENV=production npm install
           

一旦安裝了某個子產品,就可以在代碼中用

require

指令加載這個子產品。

var backbone = require('backbone')
console.log(backbone.VERSION)
           

預設情況下,Npm全局子產品都安裝在系統目錄(比如

/usr/local/lib/

),普通使用者沒有寫入權限,需要用到

sudo

指令。這不是很友善,我們可以在沒有root權限的情況下,安裝全局子產品。

首先,在主目錄下建立配置檔案

.npmrc

,然後在該檔案中将

prefix

變量定義到主目錄下面。

prefix = /home/yourUsername/npm
           

然後在主目錄下建立

npm

子目錄。

$ mkdir ~/npm
           

此後,全局安裝的子產品都會安裝在這個子目錄中,npm也會到

~/npm/bin

目錄去尋找指令。

最後,将這個路徑在

.bash_profile

檔案(或

.bashrc

檔案)中加入PATH變量。

export PATH=~/npm/bin:$PATH
           

npm update

指令可以更新本地安裝的子產品。

# 更新目前項目的指定子產品
$ npm update [package name]

# 更新全局安裝的子產品
$ npm update -global [package name]
           

它會先到遠端倉庫查詢最新版本,然後查詢本地版本。如果本地版本不存在,或者遠端版本較新,就會安裝。

使用

-S

--save

參數,可以在安裝的時候更新

package.json

裡面子產品的版本号。

// 更新之前的package.json
dependencies: {
  dep1: "^1.1.1"
}

// 更新之後的package.json
dependencies: {
  dep1: "^1.2.2"
}
           

注意,從npm v2.6.1 開始,

npm update

隻更新頂層子產品,而不更新依賴的依賴,以前版本是遞歸更新的。如果想取到老版本的效果,要使用下面的指令。

$ npm --depth 9999 update
           

npm uninstall

指令,解除安裝已安裝的子產品。

$ npm uninstall [package name]

# 解除安裝全局子產品
$ npm uninstall [package name] -global
           

npm

不僅可以用于子產品管理,還可以用于執行腳本。

package.json

檔案有一個

scripts

字段,可以用于指定腳本指令,供

npm

直接調用。

{
  "name": "myproject",
  "devDependencies": {
    "jshint": "latest",
    "browserify": "latest",
    "mocha": "latest"
  },
  "scripts": {
    "lint": "jshint **.js",
    "test": "mocha test/"
  }
}
           

上面代碼中,

scripts

字段指定了兩項指令

lint

test

。指令行輸入

npm run-script lint

或者

npm run lint

,就會執行

jshint **.js

,輸入

npm run-script test

npm run test

mocha test/

npm run

npm run-script

的縮寫,一般都使用前者,但是後者可以更好地反應這個指令的本質。

npm run

指令會自動在環境變量

$PATH

添加

node_modules/.bin

目錄,是以

scripts

字段裡面調用指令時不用加上路徑,這就避免了全局安裝NPM子產品。

npm run

如果不加任何參數,直接運作,會列出

package.json

裡面所有可以執行的腳本指令。

npm内置了兩個指令簡寫,

npm test

等同于執行

npm run test

npm start

npm run start

npm run

會建立一個Shell,執行指定的指令,并臨時将

node_modules/.bin

加入PATH變量,這意味着本地子產品可以直接運作。

舉例來說,你執行ESLint的安裝指令。

$ npm i eslint --save-dev
           

運作上面的指令以後,會産生兩個結果。首先,ESLint被安裝到目前目錄的

node_modules

子目錄;其次,

node_modules/.bin

目錄會生成一個符号連結

node_modules/.bin/eslint

,指向ESLint子產品的可執行腳本。

然後,你就可以在

package.json

script

屬性裡面,不帶路徑的引用

eslint

這個腳本。

{
  "name": "Test Project",
  "devDependencies": {
    "eslint": "^1.10.3"
  },
  "scripts": {
    "lint": "eslint ."
  }
}
           

等到運作

npm run lint

的時候,它會自動執行

./node_modules/.bin/eslint .

如果直接運作

npm run

不給出任何參數,就會列出

scripts

屬性下所有指令。

$ npm run
Available scripts in the user-service package:
  lint
     jshint **.js
  test
    mocha test/
           

下面是另一個

package.json

檔案的例子。

"scripts": {
  "watch": "watchify client/main.js -o public/app.js -v",
  "build": "browserify client/main.js -o public/app.js",
  "start": "npm run watch & nodemon server.js",
  "test": "node test/all.js"
},
           

上面代碼在

scripts

項,定義了四個别名,每個别名都有對應的腳本指令。

$ npm run watch
$ npm run build
$ npm run start
$ npm run test
           

其中,

start

test

屬于特殊指令,可以省略

run

$ npm start
$ npm test
           

如果希望一個操作的輸出,是另一個操作的輸入,可以借用Linux系統的管道指令,将兩個操作連在一起。

"build-js": "browserify browser/main.js | uglifyjs -mc > static/bundle.js"
           

但是,更友善的寫法是引用其他

npm run

指令。

"build": "npm run build-js && npm run build-css"
           

上面的寫法是先運作

npm run build-js

,然後再運作

npm run build-css

,兩個指令中間用

&&

連接配接。如果希望兩個指令同時平行執行,它們中間可以用

&

連接配接。

下面是一個流操作的例子。

"devDependencies": {
  "autoprefixer": "latest",
  "cssmin": "latest"
},

"scripts": {
  "build:css": "autoprefixer -b 'last 2 versions' < assets/styles/main.css | cssmin > dist/main.css"
}
           

寫在

scripts

屬性中的指令,也可以在

node_modules/.bin

目錄中直接寫成bash腳本。下面是一個bash腳本。

#!/bin/bash

cd site/main
browserify browser/main.js | uglifyjs -mc > static/bundle.js
           

假定上面的腳本檔案名為build.sh,并且權限為可執行,就可以在scripts屬性中引用該檔案。

"build-js": "bin/build.sh"
           

npm run

指令還可以添加參數。

"scripts": {
  "test": "mocha test/"
}
           

上面代碼指定

npm test

,實際運作

mocha test/

。如果要通過

npm test

指令,将參數傳到mocha,則參數之前要加上兩個連詞線。

$ npm run test -- anothertest.js
# 等同于
$ mocha test/ anothertest.js
           

上面指令表示,mocha要運作所有

test

子目錄的測試腳本,以及另外一個測試腳本

anothertest.js

npm run

本身有一個參數

-s

,表示關閉npm本身的輸出,隻輸出腳本産生的結果。

// 輸出npm指令頭
$ npm run test

// 不輸出npm指令頭
$ npm run -s test
           

scripts

字段的腳本指令,有一些最佳實踐,可以友善開發。首先,安裝

npm-run-all

子產品。

$ npm install npm-run-all --save-dev
           

這個子產品用于運作多個

scripts

腳本指令。

# 繼發執行
$ npm-run-all build:html build:js
# 等同于
$ npm run build:html && npm run build:js

# 并行執行
$ npm-run-all --parallel watch:html watch:js
# 等同于
$ npm run watch:html & npm run watch:js

# 混合執行
$ npm-run-all clean lint --parallel watch:html watch:js
# 等同于
$ npm-run-all clean lint
$ npm-run-all --parallel watch:html watch:js

# 通配符
$ npm-run-all --parallel watch:*
           

(1)start腳本指令

start

腳本指令,用于啟動應用程式。

"start": "npm-run-all --parallel dev serve"
           

上面指令并行執行

dev

腳本指令和

serve

腳本指令,等同于下面的形式。

$ npm run dev & npm run serve
           

如果start腳本沒有配置,

npm start

指令預設執行下面的腳本,前提是子產品的根目錄存在一個server.js檔案。

$ node server.js
           

(2)dev腳本指令

dev

腳本指令,規定開發階段所要做的處理,比如建構網頁資源。

"dev": "npm-run-all dev:*"
           

上面指令用于繼發執行所有

dev

的子指令。

"predev:sass": "node-sass --source-map src/css/hoodie.css.map --output-style nested src/sass/base.scss src/css/hoodie.css"
           

上面指令将sass檔案編譯為css檔案,并生成source map檔案。

"dev:sass": "node-sass --source-map src/css/hoodie.css.map --watch --output-style nested src/sass/base.scss src/css/hoodie.css"
           

上面指令會監視sass檔案的變動,隻要有變動,就自動将其編譯為css檔案。

"dev:autoprefix": "postcss --use autoprefixer --autoprefixer.browsers \"> 5%\" --output src/css/hoodie.css src/css/hoodie.css"
           

上面指令為css檔案加上浏覽器字首,限制條件是隻考慮市場佔有率大于5%的浏覽器。

(3)serve腳本指令

serve

腳本指令用于啟動服務。

"serve": "live-server dist/ --port=9090"
           

上面指令啟動服務,用的是live-server子產品,将服務啟動在9090端口,展示

dist

live-server

子產品有三個功能。

  • 啟動一個HTTP伺服器,展示指定目錄的

    index.html

    檔案,通過該檔案加載各種網絡資源,這是

    file://

    協定做不到的。
  • 添加自動重新整理功能。隻要指定目錄之中,檔案有任何變化,它就會重新整理頁面。
  • npm run serve

    指令執行以後,自動打開浏覽器。、

以前,上面三個功能需要三個子產品來完成:

http-server

live-reload

opener

,現在隻要

live-server

一個子產品就夠了。

(4)test腳本指令

test

腳本指令用于執行測試。

"test": "npm-run-all test:*",
"test:lint": "sass-lint --verbose --config .sass-lint.yml src/sass/*"
           

上面指令規定,執行測試時,運作

lint

腳本,檢查腳本之中的文法錯誤。

(5)prod腳本指令

prod

腳本指令,規定進入生産環境時需要做的處理。

"prod": "npm-run-all prod:*",
"prod:sass": "node-sass --output-style compressed src/sass/base.scss src/css/prod/hoodie.min.css",
"prod:autoprefix": "postcss --use autoprefixer --autoprefixer.browsers "> 5%" --output src/css/prod/hoodie.min.css src/css/prod/hoodie.min.css"
           

上面指令将sass檔案轉為css檔案,并加上浏覽器字首。

(6)help腳本指令

help

腳本指令用于展示幫助資訊。

"help": "markdown-chalk --input DEVELOPMENT.md"
           

上面指令之中,

markdown-chalk

子產品用于将指定的markdown檔案,轉為彩色文本顯示在終端之中。

(7)docs腳本指令

docs

腳本指令用于生成文檔。

"docs": "kss-node --source src/sass --homepage ../../styleguide.md"
           

上面指令使用

kss-node

子產品,提供源碼的注釋生成markdown格式的文檔。

npm run

為每條指令提供了

pre-

post-

兩個鈎子(hook)。以

npm run lint

為例,執行這條指令之前,npm會先檢視有沒有定義prelint和postlint兩個鈎子,如果有的話,就會先執行

npm run prelint

,然後執行

npm run lint

,最後執行

npm run postlint

{
  "name": "myproject",
  "devDependencies": {
    "eslint": "latest"
    "karma": "latest"
  },
  "scripts": {
    "lint": "eslint --cache --ext .js --ext .jsx src",
    "test": "karma start --log-leve=error karma.config.js --single-run=true",
    "pretest": "npm run lint",
    "posttest": "echo 'Finished running tests'"
  }
}
           

上面代碼是一個

package.json

檔案的例子。如果執行

npm test

,會按下面的順序執行相應的指令。

  1. pretest

  2. test

  3. posttest

如果執行過程出錯,就不會執行排在後面的腳本,即如果prelint腳本執行出錯,就不會接着執行lint和postlint腳本。

{
  "test": "karma start",
  "test:lint": "eslint . --ext .js --ext .jsx",
  "pretest": "npm run test:lint"
}
           

上面代碼中,在運作

npm run test

之前,會自動檢查代碼,即運作

npm run test:lint

下面是一些常見的

pre-

post-

腳本。

  • prepublish

    :釋出一個子產品前執行。
  • postpublish

    :釋出一個子產品後執行。
  • preinstall

    :使用者執行

    npm install

    指令時,先執行該腳本。
  • postinstall

    npm install

    指令時,安裝結束後執行該腳本,通常用于将下載下傳的源碼編譯成使用者需要的格式,比如有些子產品需要在使用者機器上跟本地的C++子產品一起編譯。
  • preuninstall

    :解除安裝一個子產品前執行。
  • postuninstall

    :解除安裝一個子產品後執行。
  • preversion

    :更改子產品版本前執行。
  • postversion

    :更改子產品版本後執行。
  • pretest

    :運作

    npm test

    指令前執行。
  • posttest

    npm test

    指令後執行。
  • prestop

    npm stop

  • poststop

    npm stop

  • prestart

    npm start

  • poststart

    npm start

  • prerestart

    npm restart

  • postrestart

    npm restart

對于最後一個

npm restart

指令,如果沒有設定

restart

腳本,

prerestart

postrestart

會依次執行stop和start腳本。

另外,不能在

pre

腳本之前再加

pre

,即

prepretest

腳本不起作用。

注意,即使Npm可以自動運作

pre

post

腳本,也可以手動執行它們。

$ npm run prepublish
           

下面是

post install

的例子。

{
  "postinstall": "node lib/post_install.js"
}
           

上面的這個指令,主要用于處理從Git倉庫拉下來的源碼。比如,有些源碼是用TypeScript寫的,可能需要轉換一下。

publish

鈎子的一個例子。

{
  "dist:modules": "babel ./src --out-dir ./dist-modules",
  "gh-pages": "webpack",
  "gh-pages:deploy": "gh-pages -d gh-pages",
  "prepublish": "npm run dist:modules",
  "postpublish": "npm run gh-pages && npm run gh-pages:deploy"
}
           

上面指令在運作

npm run publish

時,會先執行Babel編譯,然後調用Webpack建構,最後發到Github Pages上面。

以上都是npm相關操作的鈎子,如果安裝某些子產品,還能支援Git相關的鈎子。下面以husky子產品為例。

$ npm install husky --save-dev
           

安裝以後,就能在

package.json

precommit

prepush

等鈎子。

{
    "scripts": {
        "lint": "eslint yourJsFiles.js",
        "precommit": "npm run test && npm run lint",
        "prepush": "npm run test && npm run lint",
        "...": "..."
    }
}
           

類似作用的子產品還有

pre-commit

precommit-hook

等。

scripts字段可以使用一些内部變量,主要是package.json的各種字段。

比如,package.json的内容是

{"name":"foo", "version":"1.2.5"}

,那麼變量

npm_package_name

的值是foo,變量

npm_package_version

的值是1.2.5。

{
  "scripts":{
    "bundle": "mkdir -p build/$npm_package_version/"
  }
}
           

運作

npm run bundle

以後,将會生成

build/1.2.5/

config

字段也可以用于設定内部字段。

"name": "fooproject",
  "config": {
    "reporter": "xunit"
  },
  "scripts": {
    "test": "mocha test/ --reporter $npm_package_config_reporter"
  }
           

上面代碼中,變量

npm_package_config_reporter

對應的就是reporter。

npm的通配符的規則如下。

  • *

    比對0個或多個字元
  • ?

    比對1個字元
  • [...]

    比對某個範圍的字元。如果該範圍的第一個字元是

    !

    ^

    ,則比對不在該範圍的字元。
  • !(pattern|pattern|pattern)

    比對任何不符合給定的模式
  • ?(pattern|pattern|pattern)

    比對0個或1個給定的模式
  • +(pattern|pattern|pattern)

    比對1個或多個給定的模式
  • *(a|b|c)

    比對0個或多個給定的模式
  • @(pattern|pat*|pat?erN)

    隻比對給定模式之一
  • **

    如果出現在路徑部分,表示0個或多個子目錄。

開發NPM子產品的時候,有時我們會希望,邊開發邊試用,比如本地調試的時候,

require('myModule')

會自動加載本機開發中的子產品。Node規定,使用一個子產品時,需要将其安裝到全局的或項目的

node_modules

目錄之中。對于開發中的子產品,解決方法就是在全局的

node_modules

目錄之中,生成一個符号連結,指向子產品的本地目錄。

npm link

就能起到這個作用,會自動建立這個符号連結。

請設想這樣一個場景,你開發了一個子產品

myModule

,目錄為

src/myModule

,你自己的項目

myProject

要用到這個子產品,項目目錄為

src/myProject

。首先,在子產品目錄(

src/myModule

)下運作

npm link

src/myModule$ npm link
           

上面的指令會在NPM的全局子產品目錄内,生成一個符号連結檔案,該檔案的名字就是

package.json

檔案中指定的子產品名。

/path/to/global/node_modules/myModule -> src/myModule
           

這個時候,已經可以全局調用

myModule

子產品了。但是,如果我們要讓這個子產品安裝在項目内,還要進行下面的步驟。

切換到項目目錄,再次運作

npm link

指令,并指定子產品名。

src/myProject$ npm link myModule
           

上面指令等同于生成了本地子產品的符号連結。

src/myProject/node_modules/myModule -> /path/to/global/node_modules/myModule
           

然後,就可以在你的項目中,加載該子產品了。

var myModule = require('myModule');
           

這樣一來,

myModule

的任何變化,都可以直接反映在

myProject

項目之中。但是,這樣也出現了風險,任何在

myProject

目錄中對

myModule

的修改,都會反映到子產品的源碼中。

如果你的項目不再需要該子產品,可以在項目目錄内使用

npm unlink

指令,删除符号連結。

src/myProject$ npm unlink myModule
           

npm bin

指令顯示相對于目前目錄的,Node子產品的可執行腳本所在的目錄(即

.bin

目錄)。

# 項目根目錄下執行
$ npm bin
./node_modules/.bin
           

npm adduser

用于在npmjs.com注冊一個使用者。

$ npm adduser
Username: YOUR_USER_NAME
Password: YOUR_PASSWORD
Email: [email protected]
           

npm publish

用于将目前子產品釋出到

npmjs.com

。執行之前,需要向

npmjs.com

申請使用者名。

$ npm adduser
           

如果已經注冊過,就使用下面的指令登入。

$ npm login
           

登入以後,就可以使用

npm publish

指令釋出。

$ npm publish
           

如果目前子產品是一個beta版,比如

1.3.1-beta.3

,那麼釋出的時候需要使用

tag

參數,将其釋出到指定标簽,預設的釋出标簽是

latest

$ npm publish --tag beta
           

如果釋出私有子產品,子產品初始化的時候,需要加上

scope

參數。隻有npm的付費使用者才能釋出私有子產品。

$ npm init --scope=<yourscope>
           

如果你的子產品是用ES6寫的,那麼釋出的時候,最好轉成ES5。首先,需要安裝Babel。

$ npm install --save-dev babel-cli@6 babel-preset-es2015@6
           

然後,在

package.json

裡面寫入

build

"scripts": {
  "build": "babel source --presets babel-preset-es2015 --out-dir distribution",
  "prepublish": "npm run build"
}
           

運作上面的腳本,會将

source

目錄裡面的ES6源碼檔案,轉為

distribution

目錄裡面的ES5源碼檔案。然後,在項目根目錄下面建立兩個檔案

.npmignore

.gitignore

,分别寫入以下内容。

// .npmignore
source

// .gitignore
node_modules
distribution
           

如果想廢棄某個版本的子產品,可以使用

npm deprecate

$ npm deprecate my-thing@"< 0.2.3" "critical bug fixed in v0.2.3"
           

運作上面的指令以後,小于

0.2.3

版本的子產品的

package.json

都會寫入一行警告,使用者安裝這些版本時,這行警告就會在指令行顯示。

子產品的維護者可以釋出新版本。

npm owner

指令用于管理子產品的維護者。

# 列出指定子產品的維護者
$ npm owner ls <package name>

# 新增維護者
$ npm owner add <user> <package name>

# 删除維護者
$ npm owner rm <user> <package name>
           

npm home

指令可以打開一個子產品的首頁,

npm repo

指令則是打開一個子產品的代碼倉庫。

$ npm home $package
$ npm repo $package
           

這兩個指令不需要子產品先安裝。

npm outdated

指令檢查目前項目所依賴的子產品,是否已經有新版本。

$ npm outdated
           

它會輸出目前版本(current version)、應當安裝的版本(wanted version)和最新釋出的版本(latest version)。

npm prune

檢查目前項目的

node_modules

目錄中,是否有

package.json

裡面沒有提到的子產品,然後将所有這些子產品輸出在指令行。

$ npm prune
           

npm shrinkwrap

的作用是鎖定目前項目的以來子產品的版本。

$ npm shrinkwrap
           

運作該指令後,會在目前項目的根目錄下生成一個

npm-shrinkwrap.json

檔案,内容是

node_modules

目錄下所有已經安裝子產品的版本。

下次運作

npm install

指令時,

npm

發現目前目錄下有

npm-shrinkwrap.json

檔案,就會隻安裝裡面提到的子產品,且版本也會保持一緻。

版權聲明:本文為部落客原創文章,如需轉載請聲明檔案出處。