原文位址: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
,會按下面的順序執行相應的指令。
-
pretest
-
test
-
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
指令時,安裝結束後執行該腳本,通常用于将下載下傳的源碼編譯成使用者需要的格式,比如有些子產品需要在使用者機器上跟本地的C++子產品一起編譯。npm install
-
:解除安裝一個子產品前執行。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)
-
比對0個或1個給定的模式?(pattern|pattern|pattern)
-
比對1個或多個給定的模式+(pattern|pattern|pattern)
-
比對0個或多個給定的模式*(a|b|c)
-
隻比對給定模式之一@(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
檔案,就會隻安裝裡面提到的子產品,且版本也會保持一緻。
版權聲明:本文為部落客原創文章,如需轉載請聲明檔案出處。