package.json是什么?
直接的說:就是管理你本地安裝的npm包
一個package.json文件可以做如下事情:展示項目所依賴的npm包
允許你指定一個包的版本[范圍]
讓你建立起穩定,意味着你可以更好的與其他開發者共享
創建package.json
在你要創建的目錄下執行:npm init,系統會一一提示設置相關配置。提示設置的字段均為必填字段(有的可以用回車鍵,即設置為空帶過)
- npm init –yes|-y: 執行此命令,則會直接創建一個package.json,只配置了一些必填字段,並且給出默認值。其中name: 所處的文件夾名稱
package.json配置說明
這里說的項目廣義,比如:我們可以把我們的項目發布成一個npm包
- name: 項目名稱
- version: 項目版本號
- description: 項目描述
- keywords: {Array}關鍵詞,便於用戶搜索到我們的項目
- homepage: 項目url主頁
-
bugs: 項目問題反饋的Url或email配置,如:
{
“url” : “https://github.com/owner/project/issues“,
“email” : “project@hostname.com”
} -
license: 項目許可證,讓使用者知道是如何被允許使用此項目。默認是”ISC”
-
author,contributors: 坐着和貢獻者。格式設置如下:
{ “name” : “Barney Rubble”
, “email” : “b@rubble.com”
, “url” : “http://barnyrubble.tumblr.com/”
} -
files: 包含在項目中的文件數組。如果在數組里面聲明了一個文件夾,那也會包含文件夾中的文件。可以聲明一些規則來忽略部分文件。可以在項目根目錄或者子目錄里聲明一個.npmignore。
Certain files are always included, regardless of settings:
package.json
README (and its variants)
CHANGELOG (and its variants)
LICENSE / LICENCE
Conversely, some files are always ignored:.git
CVS
.svn
.hg
.lock-wscript
.wafpickle-N
*.swp
.DS_Store
._*
npm-debug.log
- main: 主文件。比如默認是index.js,項目名稱叫mymodule。那么require(‘mymodule’)將返回index.js返回的內容
- bin: 項目用到的可執行文件配置
- man: 指定一個單一的文件名或一個文件名數組。意思類似於linux命令中的man 命令,來查看一個命令的用法
如果只給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這個文件。
如果指定的文件名並未以包名開頭,那么它會被冠以前綴,像這樣
{
“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后綴(當它被壓縮時)。這個數字說明了這個文件被安裝到哪個節中
{
“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對象來標示你的包結構的方法
- directories.lib: 告訴你庫文件夾的位置,目前沒有什么地方需要用到lib文件夾,但是這是重要的元信息
-
directories.bin: 如果你在directories.bin中指定一個bin目錄,在這個目錄中的所有文件都會被當做在bin來使用。
由於bin指令的工作方式,同時指定一個bin路徑和設置directories.bin將是一個錯誤。如果你想指定獨立的文件,使用bin,如果想執行某個文件夾里的所有文件,使用directories.bin。
-
directories.doc: 把markdown文件放在這。也許某一天這些文件將被漂亮地展示出來,不過這僅僅是也許
- directories.man: directories.man指定的文件夾里都是man文件,系統通過遍歷這個文件夾來生成一個man的數組
- directories.example: 把示例腳本放在這。也許某一天會被用到
-
repository: 項目代碼存放地方
“repository” :
{ “type” : “git”
, “url” : “https://github.com/npm/npm.git”
}
“repository” :
{ “type” : “svn”
, “url” : “https://v8.googlecode.com/svn/trunk/”
} -
scripts: 聲明一系列npm腳本指令
- prepublish: 在包發布之前運行,也會在npm install安裝到本地時運行
- publish,postpublish: 包被發布之后運行
- preinstall: 包被安裝前運行
- install,postinstall: 包被安裝后運行
- preuninstall,uninstall: 包被卸載前運行
- postuninstall: 包被卸載后運行
- preversion: bump包版本前運行
- postversion: bump包版本后運行
- pretest,test,posttest: 通過npm test命令運行
- prestop,stop,poststop: 通過npm stop命令運行
- prestart,start,poststart: 通過npm start命令運行
- prerestart,restart,postrestart: 通過npm restart運行
-
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 -
dependencies: 項目在生產環境中依賴的包
- devDependencies: 項目在開發和測試環境中依賴的包
-
peerDependencies: 在某些情況下,當一個主機無法require依賴包時,你會想要告訴它還有哪些工具或庫與這個依賴包兼容。這通常被成為一個插件。尤其是在host文檔中聲明的模塊會暴露一個特定的接口
{
“name”: “tea-latte”,
“version”: “1.3.5”,
“peerDependencies”: {
“tea”: “2.x”
}
}
這將確保tea-latte這個包只會和2.x版本的tea一起被安裝。執行npm install tea-latte可能產生以下關系圖:
├── tea-latte@1.3.5
└── tea@2.2.0 -
bundledDependencies: {Array},發布時會被一起打包的模塊
-
optionalDependencies: 如果一個依賴模塊可以被使用, 同時你也希望在該模塊找不到或無法獲取時npm繼續運行,你可以把這個模塊依賴放到optionalDependencies配置中。這個配置的寫法和dependencies的寫法一樣,不同的是這里邊寫的模塊安裝失敗不會導致npm install失敗。當然,這種模塊就需要你自己在代碼中處理模塊確實的情況了,例如:
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()
} -
engines: 聲明項目需要的node或npm版本范圍
{ “engines” : { “npm” : “~1.0.20” } }
{ “engines” : { “node” : “>=0.10.3 <0.12” } } -
os: 指定你的項目將運行在什么操作系統上
- cpu: 指定你的項目將運行在什么cpu架構上
- preferGlobal: 如果你的包需要全局安裝,通過命令行來運行,那么設置為true。如果這個包被本地安裝則會出現一個警告
- private: 如果設置為true, 那么npm會拒絕發布它
- publishConfig