package.json

原文鏈接:http://www.mujiang.info/translation/npmjs/files/package.json.html

DESCRIPTION

本文檔有所有package.json中必要的配置。它必須是真正的json,而不是js對象。
本文檔中描述的很多行為都受npm-config(7)的影響。

一、name

在package.json中 最重要 的就是name和version字段。
他們都是必須的,如果沒有就無法install。
name和version一起組成的標識在假設中是唯一的。
改變包應該同時改變version。
name是這個東西的名字。

注意:不要把node或者js放在名字中。因為你寫了package.json它就被假定成為了js,不過你可以用"engine"字段指定一個引擎(見后文)。

這個名字會作為在URL的一部分、命令行的參數或者文件夾的名字。任何non-url-safe的字符都是不能用的。

這個名字可能會作為參數被傳入require(),所以它應該比較短,但也要意義清晰。

在命名你的name之前,你可能要去npm registry查看一下這個名字是否已經被使用了。 http://registry.npmjs.org/

二、version

version必須能被 node-semver解析,它被包在npm的依賴中。(要自己用可以執行npm install semver)
更多可用的“數字”或者“范圍”見semver(7).

三、scripts

存放 npm腳本的地方,npm run XXX,鍵值對形式存在

image.png

參見 npm-scripts(7)

四、dependencies

你的項目依賴的其他的第三方包。

請不要將測試或過渡性的依賴放在dependencies中。
見下文的devDependencies

1、波浪符號(~):更新到當前minor version(也就是中間的那位數字)中最新的版本。

body-parser:~1.15.2 --> 1.15.X ,但不會更新到: 1.16.0

2、插入符號(^):更新到當前major version(也就是第一位數字)中最新的版本。

bluebird:^3.3.4 --> 3.X.X, 但不會自動更新到4.0.0。

比如下面都是合法的:

{ 
 "devDependencies": {
    "acorn": "~0.6.0",
    "baconjs": "^0.7.43",
    "bluebird": "^2.9.2",
    "body-parser": "^1.10.2",
    "browserify": "^8.1.1",
    "cli-table": "~0.3.1",
    "co": "^4.2.0",
  }
}

五、devDependencies

僅在開發環境下使用的依賴包,放在devDependencies中。

線上發布時,如果dev依賴中的包不需要,那么可以執行:
npm prune --production 來刪除已安裝的dev依賴包,以減少項目體積。

對于構建步驟,比如需要編譯CoffeeScript,可以用prepublish腳本去實現,并把它依賴的包放在devDependency中。
比如:

{ 
  "name": "ethopia-waza", 
  "description": "a delightfully fruity coffee varietal", 
  "version": "1.2.3", 
  "devDependencies": { 
    "coffee-script": "~1.6.3" 
  }, 
  "scripts": { 
    "prepublish": "coffee -o lib/ -c src/waza.coffee" 
  }, 
  "main": "lib/waza.js"
}

六、optionalDependencies

如果一個依賴可用,但你希望在它安裝錯誤的時候npm也能繼續初始化,那么你可以把它放在optionalDependencieshash中。

線上發布時可以選擇不安裝此目錄下的依賴:
npm install --no-optional

處理缺乏依賴也是你的程序的責任。比如像這樣:

try { 
  var foo = require('foo') 
  var fooVersion = require('foo/package.json').version
} catch (er) { 
  foo = null
}
if ( notGoodFooVersion(fooVersion) ) { 
  foo = null
}
// .. then later in your program ..
if (foo) { 
  foo.doFooThings()
}

optionalDependencies會覆蓋dependencies中同名的項,所以通常比只放在一個地方好。

七、bundledDependencies

一組包名,他們會在發布的時候被打包進去。
拼成"bundleDependencies"
(缺d)也可以。

八、keywords

放簡介,字符串。方便在 npm search中搜索。

九、homepage

一般放這個項目的 git地址

十、bugs

你項目的提交問題的url和(或)郵件地址。

{ 
  "url" : "http://github.com/owner/project/issues", 
  "email" : "project@hostname.com"
}

你可以指定一個或者兩個。如果你只想提供一個url,那就直接用字符串。
如果提供了url,它會被npm bugs命令使用。

十一、license

你應該要指定一個許可證,讓人知道使用的權利和限制的。
最簡單的方法是,假如你用一個像BSD或者MIT這樣通用的許可證,就只需要指定一個許可證的名字,像這樣:

{ "license" : "BSD" }

如果你有更復雜的許可條件,或者想要提供給更多地細節,可以這樣:

"licenses" : [ 
   { 
       "type" : "MyLicense" , 
       "url" : "http://github.com/owner/project/path/to/license" 
   }
]

在根目錄中提供一個許可證文件也蠻好的。
people fields: author, contributors
author是一個人。contributors是一堆人的數組。person是一個有name字段,可選的有url、email字段的對象,像這樣:

{ 
  "name" : "Barney Rubble", 
  "email" : "b@rubble.com", 
  "url" : "http://barnyrubble.tumblr.com/"
}

或者可以把所有的東西都放到一個字符串里,npm會給你解析:
"Barney Rubble b@rubble.com (http://barnyrubble.tumblr.com/)

email和url在兩種形式中都是可選的。
也可以在你的npm用戶信息中設置一個頂級的maintainers字段。

十二、files

files是一個包含項目中的文件的數組。如果命名了一個文件夾,那也會包含文件夾中的文件。(除非被其他條件忽略了)
你也可以提供一個.npmignore文件,讓即使被包含在files字段中得文件被留下。其實就像.gitignore一樣。

image.png

十三、main

main字段配置一個文件名指向模塊的入口程序。如果你包的名字叫foo,然后用戶require("foo"),main配置的模塊的exports對象會被返回。
這應該是一個相對于根目錄的文件路徑。

十四、bin

很多包都有一個或多個可執行的文件希望被放到PATH中。npm讓媽媽再也不用擔心了(實際上,就是這個功能讓npm可執行的)。
要用這個功能,給package.json中的bin
字段一個命令名到文件位置的map。初始化的時候npm會將他鏈接到prefix/bin
(全局初始化)或者./node_modules/.bin/
(本地初始化)。
比如,npm有:

{ "bin" : { "npm" : "./cli.js" } }

所以,當你初始化npm,它會創建一個符號鏈接到cli.js
腳本到/usr/local/bin/npm。
如果你只有一個可執行文件,并且名字和包名一樣。那么你可以只用一個字符串,比如:

{ "name": "my-program", "version": "1.2.5", "bin": "./path/to/program" }

結果和這個一樣:

{ "name": "my-program", "version": "1.2.5", "bin" : { "my-program" : "./path/to/program" } }

十五、man

指定一個單一的文件或者一個文件數組供man程序使用。
如果只提供一個單一的文件,那么它初始化后就是man <pkgname>
的結果,而不管實際的文件名是神馬,比如:

{ 
  "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文件了。
如果文件名不是以包名開頭,那么它會被冠以前綴,下面的:

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

會為man foo和man foo-bar創建文件。
man文件需要以數字結束,然后可選地壓縮后以.gz為后綴。The number dictates which man section the file is installed into.

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

會為man foo和man 2 foo創建。

directories

CommonJS Packages規范說明了幾種方式讓你可以用directories
hash標示出包得結構。如果看一下npm's package.json,你會看到有directories標示出doc, lib, and man。
在未來,這個信息可能會被用到。

directories.lib

告訴屌絲們你的庫文件夾在哪里。目前沒有什么特別的東西需要用到lib文件夾,但確實是重要的元信息。

directories.bin

如果你指定一個“bin”目錄,然后在那個文件夾中得所有文件都會被當做"bin"字段使用。
如果你已經指定了“bin”字段,那這個就無效。

directories.man

一個放滿man頁面的文件夾。貼心地創建一個“man”字段。A folder that is full of man pages. Sugar to generate a "man" array bywalking the folder.

directories.doc

將markdown文件放在這里。最后,這些會被很好地展示出來,也許,某一天。Put markdown files in here. Eventually, these will be displayed nicely,maybe, someday.

directories.example

將事例腳本放在這里。某一天,它可能會以聰明的方式展示出來。

repository

指定你的代碼存放的地方。這個對希望貢獻的人有幫助。如果git倉庫在github上,那么npm docs
命令能找到你。
這樣做:

"repository" : { 
  "type" : "git" , 
  "url" : "http://github.com/isaacs/npm.git" 
}

"repository" : { 
  "type" : "svn" , 
  "url" : "http://v8.googlecode.com/svn/trunk/" 
}

URL應該是公開的(即便是只讀的)能直接被未經過修改的版本控制程序處理的url。不應該是一個html的項目頁面。因為它是給計算機看的。

config

"config" hash可以用來配置用于包腳本中的跨版本參數。在實例中,如果一個包有下面的配置:

{ "name" : "foo", "config" : { "port" : "8080" } }

然后有一個“start”命令引用了npm_package_config_port
環境變量,用戶可以通過npm config set foo:port 8001
來重寫他。
參見 npm-config(7)npm-scripts(7)

engines

你可以指定工作的node的版本:

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

并且,像dependensies一樣,如果你不指定版本或者指定“*”作為版本,那么所有版本的node都可以。
如果指定一個“engines”字段,那么npm會需要node在里面,如果“engines”被省略,npm會假定它在node上工作。
你也可以用“engines”字段來指定哪一個npm版本能更好地初始化你的程序,如:

{ "engines" : { "npm" : "~1.0.20" } }

記住,除非用戶設置engine-strict標記,這個字段只是建議值。

  • engineStrict

如果你確定你的模塊一定不會運行在你指定版本之外的node或者npm上,你可以在package.json文件中設置"engineStrict":true。它會重寫用戶的engine-strict
設置。
除非你非常非常確定,否則不要這樣做。如果你的engines hash過度地限制,很可能輕易讓自己陷入窘境。慎重地考慮這個選擇。如果大家濫用它,它會再以后的npm版本中被刪除。

  • os

你可以指定你的模塊要運行在哪些操作系統中:
"os" : [ "darwin", "linux" ]

你也可以用黑名單代替白名單,在名字前面加上“!”就可以了:
"os" : [ "!win32" ]

操作系統用process.platform來探測。
雖然沒有很好地理由,但它是同時支持黑名單和白名單的。

  • cpu

如果你的代碼只能運行在特定的cpu架構下,你可以指定一個:
"cpu" : [ "x64", "ia32" ]

就像os選項,你也可以黑一個架構:
"cpu" : [ "!arm", "!mips" ]

cpu架構用process.arch探測。

  • preferGlobal

如果包主要是需要全局安裝的命令行程序,就設置它為true
來提供一個warning給只在局部安裝的人。
它不會真正的防止用戶在局部安裝,但如果它沒有按預期工作它會幫助防止產生誤會。

  • private

如果你設置 "private": true,npm就不會發布它。
這是一個防止意外發布私有庫的方式。如果你要確定給定的包是只發布在特定registry(如內部registry)的,用publishConfig hash的描述來重寫registry的publish-time配置參數。

  • publishConfig

這是一個在publish-time使用的配置集合。當你想設置tag或者registry的時候它非常有用,所以你可以確定一個給定的包沒有打上“lastest”的tag或者被默認發布到全局的公開registry。
任何配置都可以被重寫,但當然可能只有“tag”和“registry”與發布的意圖有關。
參見npm-config(7)有可以被重寫的列表。

  • DEFAULT VALUES

npm會根據包的內容設置一些默認值。
"scripts": {"start": "node server.js"}

如果包的根目錄有server.js文件,npm會默認將start命令設置為node server.js。

"scripts":{"preinstall": "node-waf clean || true; node-waf configure build"}

如果包的根目錄有wscript文件,npm會默認將preinstall命令用node-waf進行編譯。

"scripts":{"preinstall": "node-gyp rebuild"} 

如果包的根目錄有binding.gyp文件,npm會默認將preinstall命令用node-gyp進行編譯。

"contributors": [...]

如果有AUTHORS
文件,npm會默認逐行按Name <email> (url)格式處理,郵箱和url是可選的。#號和空格開頭的行會被忽略。

SEE ALSO
semver(7)
npm-init(1)
npm-version(1)
npm-config(1)
npm-config(7)
npm-help(1)
npm-faq(7)
npm-install(1)
npm-publish(1)
npm-rm(1)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 原文:http://javascript.ruanyifeng.com/nodejs/packagejson.ht...
    水墨熊貓閱讀 1,221評論 0 2
  • name 必須字段。提示: 不要在name中包含 js、 node 字樣; 這個名字最終會是 URL 的一部分,命...
    djyuning閱讀 1,421評論 0 1
  • 1.背景介紹 NPM是什么?NPM(node package manager),通常稱為node包管理器。顧名思義...
    我叫于搞吧閱讀 1,162評論 0 1
  • 作為一個前端工程師,不斷地去學習前端新技術是必須的。在這過程中,不斷接觸開源項目是必不可少的。github上的開源...
    居客俠閱讀 1,127評論 0 0