<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
package.json必須是一個嚴格的json檔案,而不僅僅是js裡邊的一個物件。其中很多屬性可以通過npm-config來生成
package.json中最重要的屬性是name和version兩個屬性,這兩個屬性是必須要有的,否則模組就無法被安裝,這兩個屬性一起形成了一個npm模組的唯一識別符號。模組中內容變更的同時,模組版本也應該一起變化。 name屬性就是你的模組名稱,下面是一些命名規則:
name必須小於等於214個位元組,包括字首名稱在內(如 xxx/xxxmodule)。
name不能以"_"或"."開頭
不能含有大寫字母
name會成為url的一部分,不能含有url非法字元
下面是官網檔案的一些建議:
不要使用和node核心模組一樣的名稱
name中不要含有"js"和"node"。 It's assumed that it's js, since you're writing a package.json file, and you can specify the engine using the "engines" field. (See below.)
name屬性會成為模組url、命令列中的一個引數或者一個資料夾名稱,任何非url安全的字元在name中都不能使用,也不能以"_"或"."開頭
name屬性也許會被寫在require()的引數中,所以最好取個簡短而語意化的值。
建立一個模組前可以先到後邊的網址查查name是否已經被佔用. www.npmjs.com/
# 釋出一個包的時候,需要檢驗某個包名是否存在 npm search <ModuleName>
name屬性可以有一些字首如 e.g. @myorg/mypackage.在npm-scope(7)的檔案中可以看到詳細說明
version必須可以被npm依賴的一個node-semver模組解析。具體規則見下面的dependencies模組
一個描述,方便別人瞭解你的模組作用,搜尋的時候也有用。
一個字串陣列,方便別人搜尋到本模組
專案主頁url 注意: 這個專案主頁url和url屬性不同,如果你填寫了url屬性,npm註冊工具會認為你把專案發布到其他地方了,獲取模組的時候不會從npm官方倉庫獲取,而是會重定向到url屬性設定的地址。 (原檔案中用了 spit(吐)這個單詞,作者表示他不是在開玩笑:)
填寫一個bug提交地址或者一個郵箱,被你的模組坑到的人可以通過這裡吐槽,例如:
{ "url" : "https://github.com/owner/project/issues", "email" : "project@hostname.com" }
url和email可以任意填或不填,如果只填一個,可以直接寫成一個字串而不是物件。如果填寫了url,npm bugs命令會使用這個url。
你應該為你的模組制定一個協定,讓使用者知道他們有何許可權來使用你的模組,以及使用該模組有哪些限制。最簡單的,例如你用BSD-3-Clause 或 MIT之類的協定,如下:
{ "license" : "MIT" }
你可以在spdx.org/licenses/ 這個地址查閱協定列表 。
author是一個碼農, contributors是一個碼農陣列。 person是一個有一些描述屬性的物件,如下 like this:
{ "name" : "Barney Rubble", "email" : "b@rubble.com", "url" : "http://barnyrubble.tumblr.com/" }
也可以按如下格式縮寫,npm會幫著轉換:
"Barney Rubble b@rubble.com (http://barnyrubble.tumblr.com/)"
email和url屬性實際上都是可以省略的。描述使用者資訊的還有一個maintainers(維護者)屬性。
files屬性的值是一個陣列,內容是模組下檔名或者資料夾名,如果是資料夾名,則資料夾下所有的檔案也會被包含進來(除非檔案被另一些設定排除了) 你也可以在模組根目錄下建立一個.npmignore檔案(windows下無法直接建立以"."開頭的檔案,使用linux命令列工具建立如git bash),寫在這個檔案裡邊的檔案即便被寫在files屬性裡邊也會被排除在外,這個檔案的寫法".gitignore"類似。
main屬性指定了程式的主入口檔案。意思是,如果你的模組被命名為foo,使用者安裝了這個模組並通過require("foo")來使用這個模組,那麼require返回的內容就是main屬性指定的檔案中 module.exports指向的物件。 它應該指向模組根目錄下的一個檔案。對大對數模組而言,這個屬性更多的是讓模組有一個主入口檔案,然而很多模組並不寫這個屬性。
很多模組有一個或多個需要設定到PATH路徑下的可執行模組,npm讓這個工作變得十分簡單(實際上npm本身也是通過bin屬性安裝為一個可執行命令的) 如果要用npm的這個功能,在package.json裡邊設定一個bin屬性。bin屬性是一個已命令名稱為key,本地檔名稱為value的map如下:
{ "bin" : { "myapp" : "./cli.js" } }
模組安裝的時候,若是全域性安裝,則npm會為bin中設定的檔案在bin目錄下建立一個軟連線(對於windows系統,預設會在C:UsersusernameAppDataRoamingnpm目錄下),若是區域性安裝,則會在專案內的./node_modules/.bin/目錄下建立一個軟連結。 因此,按上面的例子,當你安裝myapp的時候,npm就會為cli.js在/usr/local/bin/myapp路徑建立一個軟連結。 如果你的模組只有一個可執行檔案,並且它的命令名稱和模組名稱一樣,你可以只寫一個字串來代替上面那種設定,例如:
{ "name": "my-program", "version": "1.2.5", "bin": "./path/to/program" }
作用和如下寫法相同:
{ "name": "my-program", "version": "1.2.5", "bin" : { "my-program" : "./path/to/program" } }
制定一個或通過陣列制定一些檔案來讓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 檔案的內容。 如果man檔名稱不是以模組名稱開頭的,安裝的時候會給加上模組名稱字首。因此,下面這段設定:
{ "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結尾。數位表示檔案將被安裝到man的哪個部分。
{ "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 兩條命令。
CommonJs通過directories來制定一些方法來描述模組的結構,看看npm的package.json檔案registry.npmjs.org/npm/latest 。
告訴使用者模組中lib目錄在哪,這個設定目前沒有任何作用,但是對使用模組的人來說是一個很有用的資訊。
如果你在這裡指定了bin目錄,這個設定下面的檔案會被加入到bin路徑下,如果你已經在package.json中設定了bin目錄,那麼這裡的設定將不起任何作用。
指定一個目錄,目錄裡邊都是man檔案,這是一種設定man檔案的語法糖。
在這個目錄裡邊放一些markdown檔案,可能最終有一天它們會被友好的展現出來(應該是在npm的網站上)
放一些範例指令碼,或許某一天會有用 - -!
指定一個程式碼存放地址,對想要為你的專案貢獻程式碼的人有幫助。像這樣:
"repository" : { "type" : "git", "url" : "https://github.com/npm/npm.git" } "repository" : { "type" : "svn", "url" : "https://v8.googlecode.com/svn/trunk/" }
若你的模組放在GitHub, GitHub gist, Bitbucket, or GitLab的倉庫裡,npm install的時候可以使用縮寫標記來完成:
"repository": "npm/npm" "repository": "gist:11081aaa281" "repository": "bitbucket:example/repo" "repository": "gitlab:another/repo"
scripts屬性是一個物件,裡邊指定了專案的生命週期個各個環節需要執行的命令。key是生命週期中的事件,value是要執行的命令。 具體的內容有 install start stop 等,詳見 https://docs.npmjs.com/misc/scripts
用來設定一些專案不怎麼變化的專案設定,例如port等。 使用者用的時候可以使用如下用法:
http.createServer(...).listen(process.env.npm_package_config_port)
可以通過npm config set foo:port 80來修改config。詳見docs.npmjs.com/misc/config
{ "name" : "foo", "config" : { "port" : "8080" } }
dependencies屬性是一個物件,設定模組依賴的模組列表,key是模組名稱,value是版本範圍,版本範圍是一個字元,可以被一個或多個空格分割。 dependencies也可以被指定為一個git地址或者一個壓縮包地址。 不要把測試工具或transpilers寫到dependencies中。 下面是一些寫法,詳見docs.npmjs.com/misc/semver
{ "dependencies" : { "foo" : "1.0.0 - 2.9999.9999" , "bar" : ">=1.0.2 <2.1.2" , "baz" : ">1.0.2 <=2.3.4" , "boo" : "2.0.1" , "qux" : "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0" , "asd" : "http://asdf.com/asdf.tar.gz" , "til" : "~1.2" , "elf" : "~1.2.3" , "two" : "2.x" , "thr" : "3.3.x" , "lat" : "latest" , "dyl" : "file:../dyl" } }
在版本範圍的地方可以寫一個url指向一個壓縮包,模組安裝的時候會把這個壓縮包下載下來安裝到模組本地。
Git url可以像下面一樣:
git://github.com/user/project.git#commit-ish git+ssh://user@hostname:project.git#commit-ish git+ssh://user@hostname/project.git#commit-ish git+http://user@hostname/project/blah.git#commit-ish git+https://user@hostname/project/blah.git#commit-ish
commit-ish 可以是任意標籤,雜湊值,或者可以檢出的分支,預設是master分支。
支援github的 username/modulename 的寫法,#後邊可以加字尾寫明分支hash或標籤:
{ "name": "foo", "version": "0.0.0", "dependencies": { "express": "visionmedia/express", "mocha": "visionmedia/mocha#4727d357ea" } }
npm2.0.0版本以上可以提供一個本地路徑來安裝一個原生的模組,通過npm install xxx --save 來安裝,格式如下:
../foo/bar ~/foo/bar ./foo/bar /foo/bar
package.json 生成的相對路徑如下:
{ "name": "baz", "dependencies": { "bar": "file:../foo/bar" } }
這種屬性在離線開發或者測試需要用npm install的情況,又不想自己搞一個npm server的時候有用,但是釋出模組到公共倉庫時不應該使用這種屬性。
如果有人想要下載並使用你的模組,也許他們並不希望或需要下載一些你在開發過程中使用的額外的測試或者檔案框架。 在這種情況下,最好的方法是把這些依賴新增到devDependencies屬性的物件中。 這些模組會在npm link或者npm install的時候被安裝,也可以像其他npm設定一樣被管理,詳見npm的config檔案。 對於一些跨平臺的構建任務,例如把CoffeeScript編譯成JavaScript,就可以通過在package.json的script屬性裡邊設定prepublish指令碼來完成這個任務,然後需要依賴的coffee-script模組就寫在devDependencies屬性種。 例如:
{ "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" }
prepublish指令碼會在釋出之前執行,因此使用者在使用之前就不用再自己去完成編譯的過程了。在開發模式下,執行npm install也會執行這個指令碼(見npm script檔案),因此可以很方便的偵錯。
有時候做一些外掛開發,比如grunt等工具的外掛,它們往往是在grunt的某個版本的基礎上開發的,而在他們的程式碼中並不會出現require("grunt")這樣的依賴,dependencies設定裡邊也不會寫上grunt的依賴,為了說明此模組只能作為外掛跑在宿主的某個版本範圍下,可以設定peerDependencies:
{ "name": "tea-latte", "version": "1.3.5", "peerDependencies": { "tea": "2.x" } }
上面這個設定確保再npm install的時候tea-latte會和2.x版本的tea一起安裝,而且它們兩個的依賴關係是同級的: ├── tea-latte@1.3.5 └── tea@2.2.0 這個設定的目的是讓npm知道,如果要使用此外掛模組,請確保安裝了相容版本的宿主模組。
上面的單詞少個d,寫成bundleDependencies也可以。 指定釋出的時候會被一起打包的模組。
如果一個依賴模組可以被使用, 同時你也希望在該模組找不到或無法獲取時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() }
optionalDependencies 中的設定會覆蓋dependencies中的設定,最好只在一個地方寫。
你可以指定專案執行的node版本範圍,如下: { "engines" : { "node" : ">=0.10.3 <0.12" } } 和dependencies一樣,如果你不指定版本範圍或者指定為*,任何版本的node都可以。 也可以指定一些npm版本可以正確的安裝你的模組,例如: { "engines" : { "npm" : "~1.0.20" } } 要注意的是,除非你設定了engine-strict屬性,engines屬性是僅供參考的。
注意:這個屬性已經棄用,將在npm 3.0.0 版本幹掉。
可以指定你的模組只能在哪個作業系統上跑: "os" : [ "darwin", "linux" ] 也可以指定黑名單而不是白名單: "os" : [ "!win32" ] 服務的作業系統是由process.platform來判斷的,這個屬性允許黑白名單同時存在,雖然沒啥必要這樣搞...
限制模組只能在某某cpu架構下執行 "cpu" : [ "x64", "ia32" ] 同樣可以設定黑名單: "cpu" : [ "!arm", "!mips" ] cpu架構通過 process.arch 判斷
如果您的軟體包主要用於安裝到全域性的命令列應用程式,那麼該值設定為true ,如果它被安裝在本地,則提供一個警告。實際上該設定並沒有阻止使用者把模組安裝到本地,只是防止該模組被錯誤的使用引起一些問題。
如果這個屬性被設定為true,npm將拒絕釋出它,這是為了防止一個私有模組被無意間釋出出去。如果你只想讓模組被髮布到一個特定的npm倉庫,如一個內部的倉庫,可與在下面的publishConfig中設定倉庫引數。
這個設定是會在模組釋出時用到的一些值的集合。如果你不想模組被預設被標記為最新的,或者預設釋出到公共倉庫,可以在這裡設定tag或倉庫地址。
npm設定了一些預設引數,如:·"scripts": {"start": "node server.js"} 如果模組根目錄下有一個server.js檔案,那麼npm start會預設執行這個檔案。 "scripts":{"preinstall": "node-gyp rebuild"} 如果模組根目錄下有binding.gyp, npm將預設用node-gyp來編譯preinstall的指令碼 "contributors": [...] 若模組根目錄下有AUTHORS 檔案,則npm會按Name (url)格式解析每一行的資料新增到contributors中,可以用#新增行註釋.
到此這篇關於你可能不知道的package.json屬性的文章就介紹到這了,更多相關package.json屬性內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45