package.json 中 npm 依赖包的写法
最近接手一个项目时,注意到其package.json中的依赖有的书写方式没见过,这里学习了一下package.json中dependency的不同写法。
接手的项目中出现了下面这样的写法:
"xxx": "git+ssh://git@xxx.xxx.com/xxx/xxx/xxx#v1.0.0"
"@xxx/project-name": "~0.0.1",
之前也在其他项目中见过:
"xxx": "http://gitlab.xxx.com/xxx/xxx/archive.tar.gz?ref=0.0.1",
在业务开发中我们经常会自己开发一些包,这些包可能放在不同的地方,多种写法可以帮助我们方便的使用这些包。
什么是一个package
首先来了解一个package是指什么,A package is:
- a folder containing a program described by a package.json file
- a gzipped tarball containing (1)
- a url that resolves to (2)
- a
<name>@<version>
that is published on the registry (see npm-registry) with (3) - a
<name>@<tag>
(see npm-dist-tag) that points to (4) - a
<name>
that has a “latest” tag satisfying (5) - a
<git remote url>
that resolves to (1)
package中版本的写法
语义化版本号
最常见的是在package.json中制定版本号,版本号要符合semver。
1 | "hexo": "^3.3.7" |
大体有以下几种:
version
Must match version exactly>version
Must be greater than version>=version
etc<version
<=version
~version
“Approximately equivalent to version” See semver^version
“Compatible with version” See semver1.2.x
1.2.0
,1.2.1
, etc.*
Matches any version""
(just an empty string) Same as *version1 - version2
Same as >=version1 <=version2.range1 || range2
Passes if either range1 or range2 are satisfied
tarball URL
直接指定一个tarball URL,在npm install时会将tarball文件,也就是.tar
文件下载安装。
1 | "xxx": "http://gitlab.xxx.com/xxx/xxx/archive.tar.gz?ref=0.0.1" |
tarball的内容应当是 > a folder containing a program described by a package.json file
通常gitlab在标记tag以后,会自动生成.tar文件
。
Git URL
也可以使用git url直接从代码仓库中拉取包。
1 | "xxx": "git+ssh://git@github.com:npm/npm.git#v1.0.27" |
Git urls为以下形式:
1 | <protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>] |
其中,<protocal>
是以下几种形式: - git - git+ssh - git+http - git+https - git+file.
GitHub URL
可以直接指定一个github目录,例如
1 | "express": "expressjs/express" |
Local Paths
指定本地地址,只要指定的目录是有个package
1 | "bar": "file:../foo/bar" |
区分不同registry
这里有个区分不同registry的方法,在用户根目录下建立.npmrc
,其中内容:
1 | registry=https://registry.npm.taobao.org/@xxx:registry=http://registry.npm.xxx.com |
那么,在package.json中以"@xxx/xxx": ""
方式书写的package都会使用不同的仓库。
npm install
除了package.json,这里也列举以下npm install
可以接受的写法:
1 | npm install (with no args, in package dir) |
本地开发多个package
有时候我们的项目可能会依赖我们自己开发的package,尽管可以指定Local Paths
,但是每次都还要npm i
,也是很麻烦。
这里可以使用sync-files, 来直接同步自己开发的package。
例如:
1 | sync-files -w ./src ../other-project/node_modules/your-package/src |