package.json配置項詳解

package.json文件就是一個JSON對象,該對象的每個成員就是當前項目的一項設置。npm install命令根據這個配置文件,自動下載所需的模塊,也就是配置項目所需的運行和開發環境。javascript

配置字段

name

項目名稱html

version

項目版本號java

description

項目描述,便於用戶在npm上搜索到咱們的項目。node

keywords

是一個字符串數組,便於用戶在npm上搜索到咱們的項目。react

homepage

項目url主頁,例如:
"homepage": "https://github.com/owner/project#readme"git

bugs

項目問題反饋的Url或報告問題的email地址。例如:
{ "url" : "https://github.com/owner/project/issues" , "email" : "project@hostname.com" }
若只設置url,則bugs可用字符串來代替對象。
"bugs":"https://github.com/owner/project/issues"github

license

項目許可證,讓使用者知道如何使用此項目。web

author,contributors

author是一個person,contributors是person的數組。一個person是一個對象,包含name、url和email。例如:
{ "name" : "Barney Rubble" , "email" : "b@rubble.com" , "url" : "http://barnyrubble.tumblr.com/"}npm

files

files是一個文件數組,描述了將軟件包做爲依賴項安裝時要包括的條目。若是在數組裏面聲明瞭一個文件夾,那也會包含文件夾中的文件。某些特殊文件和目錄也被包括或排除在外,不管它們是否存在於文件數組中。json

如下文件不管是否設置,老是包含:
*   `package.json`
*   `README`
*   `CHANGES`/`CHANGELOG`/`HISTORY`
*   `LICENSE`/`LICENCE`
*   `NOTICE`
*   The file in the 「main」 field

如下文件老是被忽略:
*   `.git`
*   `CVS`
*   `.svn`
*   `.hg`
*   `.lock-wscript`
*   `.wafpickle-N`
*   `.*.swp`
*   `.DS_Store`
*   `._*`
*   `npm-debug.log`
*   `.npmrc`
*   `node_modules`
*   `config.gypi`
*   `*.orig`
*   `package-lock.json`(use shrinkwrap instead)

main

主文件。好比默認是index.js,項目名稱叫foo。那麼require("foo")將返回index.js返回的內容。路徑相對軟件包根目錄。

browser

若是要在客戶端使用模塊,則應使用browser字段來代替main字段。

bin

bin用來指定各個內部命令對應的可執行文件的位置。例如:myapp裏面包含

"bin": {
  "someTool": "./bin/someTool.js"
}

上面代碼指定,someTool 命令對應的可執行文件爲 bin 子目錄下的 someTool.js。當本地安裝myapp時,Npm會尋找這個文件,在./node_modules/.bin/目錄下創建符號連接。在上面的例子中,someTool.js會創建符號連接./node_modules/.bin/someTool。因爲./node_modules/.bin/目錄會在運行時加入系統的PATH變量,所以在運行npm時,就能夠不帶路徑,直接經過命令來調用這些腳本。

全部node_modules/.bin/目錄下的命令,均可以用npm run [命令]的格式運行。bin中引用的文件需以#!/usr/bin/envnode開頭

man

用來指定當前模塊的man文檔的位置。例如:

{ "name" : "foo", "version" : "1.2.3", "description" : "A packaged foo fooer for fooing foos", "main" : "foo.js", "man" : "./man/doc.1"}

該配置會在執行man foo時,使用./man/doc.1這個文件。

directories

CommonJS包規範詳細介紹了幾種使用directories對象來標識包結構的方法。若是您查看npm的package.json,就會看到它有doc、lib和man目錄。

  • directories.lib:庫文件夾的位置。
  • directories.bin:若是你在directories.bin中指定一個bin目錄,在這個目錄中的全部文件都會被當作在bin來使用。因爲bin指令的工做方式,同時指定一個bin路徑和設置directories.bin將是一個錯誤。若是你想指定獨立的文件,使用bin,若是想執行某個文件夾裏的全部文件,使用directories.bin。
  • directories.man:全是man文件的文件夾,系統經過遍歷這個文件夾來生成一個man的數組
  • directories.doc:把markdown文件放這裏,也許有一天能夠很好的展會出來。
  • directories.example:把示例腳本放這裏,未來可能會用到
  • directories.test:把測試放這裏,未來可能會用到

repository

代碼存放地方。例如:

"repository": {
  "type" : "git",
  "url" : "https://github.com/npm/cli.git"
}

若是包的package.json不在根目錄中,能夠經過directory來聲明他所在的位置。例如:

"repository": {
    "type": "git",
    "url": "https://github.com/facebook/create-react-app.git",
    "directory": "packages/react-scripts"
  },

image.png

scripts

scripts指定了運行腳本命令的npm命令行縮寫,好比start指定了運行npm run start時,所要執行的命令。
下面的設置指定了npm run preinstallnpm run postinstallnpm run startnpm run test時,所要執行的命令。

"scripts": {
    "preinstall": "echo here it comes!",
    "postinstall": "echo there it goes!",
    "start": "node index.js",
    "test": "tap test/*.js"
}

config

用於添加命令行的環境變量。

{
  "name" : "foo",
  "config" : { "port" : "8080" },
  "scripts" : { "start" : "node server.js" }
}

server.js中使用process.env.npm_package_config_port來獲取port。

用戶能夠經過執行npm config set foo:port 80來覆蓋該命令

dependenciesdevdependencies

dependencies指定了項目運行所依賴的模塊。devDependencies指定項目開發所須要的模塊。對應的版本能夠加上各類限定,主要有如下幾種:

  • 指定版本:好比1.2.2,遵循「大版本.次要版本.小版本」的格式規定,安裝時只安裝指定版本。
  • 波浪號(tilde)+指定版本:好比~1.2.2,表示安裝1.2.x的最新版本(不低於1.2.2),可是不安裝1.3.x,也就是說安裝時不改變大版本號和次要版本號。
  • 插入號(caret)+指定版本:好比ˆ1.2.2,表示安裝1.x.x的最新版本(不低於1.2.2),可是不安裝2.x.x,也就是說安裝時不改變大版本號。須要注意的是,若是大版本號爲0,則插入號的行爲與波浪號相同,這是由於此時處於開發階段,即便是次要版本號變更,也可能帶來程序的不兼容。
  • latest:安裝最新版本。

--save參數表示將該模塊寫入dependencies屬性,--save-dev表示將該模塊寫入devDependencies屬性。

peerdependencies

有時,你的項目和所依賴的模塊,都會同時依賴另外一個模塊,可是所依賴的版本不同。好比,你的項目依賴A模塊和B模塊的1.0版,而A模塊自己又依賴B模塊的2.0版。

大多數狀況下,這不構成問題,B模塊的兩個版本能夠並存,同時運行。可是,有一種狀況,會出現問題,就是這種依賴關係將暴露給用戶。

最典型的場景就是插件,好比A模塊是B模塊的插件。用戶安裝的B模塊是1.0版本,可是A插件只能和2.0版本的B模塊一塊兒使用。這時,用戶要是將1.0版本的B的實例傳給A,就會出現問題。所以,須要一種機制,在模板安裝的時候提醒用戶,若是A和B一塊兒安裝,那麼B必須是2.0模塊。

peerDependencies字段,就是用來供插件指定其所須要的主工具的版本。

{
  "name": "chai-as-promised",
  "peerDependencies": {
    "chai": "1.x"
  }
}

上面代碼指定,安裝chai-as-promised模塊時,主程序chai必須一塊兒安裝,並且chai的版本必須是1.x。若是你的項目指定的依賴是chai的2.0版本,就會報錯。

注意,從npm 3.0版開始,peerDependencies再也不會默認安裝了。

bundleddependencies

定義一個數組,會在發佈時將定義的模塊一塊兒打包。用於需在本地保存npm包或者下載單個文件時可用。例如:

{
  "name": "awesome-web-framework",
  "version": "1.0.0",
  "bundledDependencies": [
    "renderized", "super-streams"
  ]
}

運行npm pack命令會獲得awesome-web-framework-1.0.0.tgz。執行npm install awesome-web-framework-1.0.0.tgz將在新項目中安裝renderizedsuper-streams這兩個依賴項

optionaldependencies

若但願在包找不到或者安裝失敗時,npm繼續運行,可將該包放在optionalDependencies對象中。須要你在代碼中處理模塊缺失的問題。optionalDependencies會覆蓋dependencies中同名的,因此最好只放在一個地方。

engines

engines字段指明瞭該模塊運行的平臺,好比 Node 的某個版本或者瀏覽器。該字段也能夠指定適用的npm版本。

{ "engines" : { "node" : ">=0.10.3 <0.12" } }

os

指定你的項目將運行在什麼操做系統上。

cpu

指定你的項目將運行在什麼cpu架構上。

private

若是設置爲true, 那麼npm會拒絕發佈它。

publishconfig

一組配置值,發佈時使用。

參考自:
npm-package.json
package.json文件

相關文章
相關標籤/搜索