发布一个package,name、version是必须的,它们一起组成一个唯一标示,不发布就是可选的; name必须<=214个字符,不能以.或者_开头;不能有大写字母;不能包含非url安全字符;
在.npmignore里添加不需要包含的文件,格式和.gitignore一样,如果有.gitignore文件,会忽略.npmignore;
main
main字段是一个模块id,是你项目的主要入口;如果你的package名字是foo,一个用户安装了它,然后require(‘foo’),这时,你的main模块的输出对象就会返回;
browser
如果你的模块是用在浏览器客户端的话,要用browser替代main;
bin
很多package都有一些可执行文件,它们会安装到PATH;
为了使用它,提供了bin字段,它是命令名称到本地文件的映射;安装的时候,
对于全局安装,npm会链接文件到prefix/bin,对于本地安装链接到/node_modules/.bin/;
例如:{ "bin" : { "myapp" : "./cli.js" } }
当你安装myapp时,会创建一个从clI.js到/usr/local/bin/myapp的系统链接;
如果要单独执行,它的名字要和package的name一致,如
{ "name": "my-program"
, "version": "1.2.5"
, "bin": "./path/to/program" }和下面的写法是一样的;
{ "name": "my-program"
, "version": "1.2.5"
, "bin" : { "my-program" : "./path/to/program" } }
注意,可执行文件必须以#!/usr/bin/env node 开始;否则不会在node里执行;
依赖
version 严格版本号
>version 大于此版本号
>=version 大于等于
<version 。。
<=version 。。
~version 近似等于此版本号 (~1.2 := >=1.2.0 <1.(2+1).0 := >=1.2.0 <1.3.0 (Same as 1.2.x))
^version 和此版本兼容(^1.2.x := >=1.2.0 <2.0.0
^0.0.x := >=0.0.0 <0.1.0
^0.0 := >=0.0.0 <0.1.0
^1.x := >=1.0.0 <2.0.0
^0.x := >=0.0.0 <1.0.0
)
1.2.x 1.2.0, 1.2.1, etc., but not 1.3.0
* 任意版本
"" 空字符串含义和 * 一样
version1 - version2 Same as >=version1 <=version2.
range1 || range2 Passes if either range1 or range2 are satisfied.
http://... 可以指定一个压缩tar包的地址;
git... <protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]
<protocol> is one of git, git+ssh, git+http, git+https, or git+file.
( git+ssh://git@github.com:npm/cli.git#v1.0.27
git+ssh://git@github.com:npm/cli#semver:^5.0
git+https://isaacs@github.com/npm/cli.git
git://github.com/npm/cli.git#v1.0.27)
user/repo See ‘GitHub URLs’ below
tag A specific version tagged and published as tag
path/path/path See Local Paths below
"bar": "file:../foo/bar",本地路径也可以使用npm i 安装;本地文件的安装只是在网络问题或者不想访问外部服务器时使用;
在发布公共包时不能使用;
下面的写法都是合理的;
{ "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"
}
}
peerdependencies
有时候做一些插件开发,比如 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一起安 装,而且它们两个的依赖关系是同级的:
这个配置的目的是让 npm 知道,如果要使用此插件模块,请确保安装了兼容 版本的宿主模块。
peerDependencies 用于指定你正在开发的模块所依赖的版本以及用户安装的依赖包版本的兼容性。
上面的说法可能有点太抽象,我们直接拿 ant-design 来举个例子,ant-design 的 package.json 中有如下配置:
"peerDependencies": {
"react": ">=16.0.0",
"react-dom": ">=16.0.0"
}
当你正在开发一个系统,使用了 ant-design ,所以也肯定需要依赖 React。同时, ant-design 也是需要依赖 React 的,它要保持稳定运行所需要的 React 版本是16.0.0,而你开发时依赖的 React 版本是 15.x:
这时,ant-design 要使用 React,并将其引入:
import * as React from 'react';
import * as ReactDOM from 'react-dom';
这时取到的是宿主环境也就是你的环境中的 React 版本,这就可能造成一些问题。在 npm2 的时候,指定上面的 peerDependencies 将意味着强制宿主环境安装 react@>=16.0.0和react-dom@>=16.0.0 的版本。
npm3 以后不会再要求 peerDependencies 所指定的依赖包被强制安装,相反 npm3 会在安装结束后检查本次安装是否正确,如果不正确会给用户打印警告提示。
"dependencies": {
"react": "15.6.0",
"antd": "^3.22.0"
}
optionalDependencies
某些场景下,依赖包可能不是强依赖的,这个依赖包的功能可有可无,当这个依赖包无法被获取到时,你希望 npm install 继续运行,而不会导致失败,你可以将这个依赖放到 optionalDependencies 中,注意 optionalDependencies 中的配置将会覆盖掉dependencies 所以只需在一个地方进行配置。
当然,引用 optionalDependencies 中安装的依赖时,一定要做好异常处理,否则在模块获取不到时会导致报错。
bundledDependencies
和以上几个不同,bundledDependencies 的值是一个数组,数组里可以指定一些模块,这些模块将在这个包发布时被一起打包。
"bundledDependencies": ["package1" , "package2"]
install
npm install (with no args, in package dir)
npm install [<@scope>/]<name>
npm install [<@scope>/]<name>@<tag>
npm install [<@scope>/]<name>@<version>
npm install [<@scope>/]<name>@<version range>
npm install <git-host>:<git-user>/<repo-name>
npm install <git repo url>
npm install <tarball file>
npm install <tarball url>
npm install <folder>
npm install 会安装所有依赖; 当使用--production或者NODE_ENV = production, 不会安装devDependencies里的内容;
npm install 默认会把指定的包安装到dependencies里;可以加参数处理:
-P, --save-prod: Package will appear in your dependencies. This is the default unless -D or -O are present.
-D, --save-dev: Package will appear in your devDependencies.
-O, --save-optional: Package will appear in your optionalDependencies.
--no-save: Prevents saving to dependencies.
-E, --save-exact: Saved dependencies will be configured with an exact version rather than using npm’s default semver range operator.
-B, --save-bundle: Saved dependencies will also be added to your bundleDependencies list.
files
files 属性用于描述你 npm publish 后推送到 npm 服务器的文件列表,如果指定文件夹,则文件夹内的所有内容都会包含进来。
{
"files": ["dist","lib","es"]
}
另外,你还可以通过配置一个 .npmignore 文件来排除一些文件, 防止大量的垃圾文件推送到 npm, 规则上和你用的 .gitignore 是一样的。.gitignore 文件也可以充当.npmignore 文件。
config
config 字段用于配置脚本中使用的环境变量,例如下面的配置,可以在脚本中使用process.env.npm_package_config_port进行获取。 { “config” : { “port” : “8080” } }
preferGlobal
如果你的 node.js 模块主要用于安装到全局的命令行工具,那么该值设置为 true ,当用户将该模块安装到本地时,将得到一个警告。这个配置并不会阻止用户安装,而是会提示用户防止错误使用而引发一些问题。
private
如果将 private 属性设置为 true,npm将拒绝发布它,这是为了防止一个私有模块被无意间发布出去。