最近接手一个项目时,注意到其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:
- folder containing a program described by a package.json file
- gzipped tarball containing (1)
- url that resolves to (2)
- @ that is published on the registry (see npm-registry) with (3)
- @ (see npm-dist-tag) that points to (4)
- that has a “latest” tag satisfying (5)
- that resolves to (1)
package中版本的写法
语义化版本号
最常见的是在package.json中制定版本号,版本号要符合semver。
"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., but not 1.3.0*
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文件下载安装。
"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直接从代码仓库中拉取包。
"xxx": "git+ssh://git@github.com:npm/npm.git#v1.0.27"
Git urls为以下形式:
<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]
其中,是以下几种形式:
- git
- git+ssh
- git+http
- git+https
- git+file.
GitHub URL
可以直接指定一个github目录,例如
`"express": "expressjs/express"
Local Paths
指定本地地址,只要指定的目录是有个package
"bar": "file:../foo/bar"
区分不同registry
这里有个区分不同registry的方法,在用户根目录下建立.npmrc,其中内容:
registry=https://registry.npm.taobao.org/
@xxx:registry=http://registry.npm.xxx.com
那么,在package.json中以"@xxx/xxx": ""
方式书写的package都会使用不同的仓库。
npm install
除了package.json,这里也列举以下npm 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>
alias: npm i
common options: [-P|--save-prod|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [-B|--save-bundle] [--no-save] [--dry-run]
本地开发多个package
有时候我们的项目可能会依赖我们自己开发的package,尽管可以指定Local Paths,但是每次都还要npm i,也是很麻烦。
这里可以使用sync-files, 来直接同步自己开发的package。
例如:
sync-files -w ./src ../other-project/node_modules/your-package/src