最近接手一个项目时,注意到其package.json中的依赖有的书写方式没见过,这里学习了一下package.json中dependency的不同写法。
接手的项目中出现了下面这样的写法:
- "xxx": "git+ssh://http://git@xxx.xxx.com/xxx/xxx/xxx#v1.0.0"
- "@xxx/project-name": "~0.0.1",
之前也在其他项目中见过:
- "xxx": "gitlab.xxx.com/xxx/xxx/arc…",
在业务开发中我们经常会自己开发一些包,这些包可能放在不同的地方,多种写法可以帮助我们方便的使用这些包。
什么是一个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 semver
- 1.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文件下载安装。
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/
2 @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)
2 npm install [<@scope>/]<name>
3 npm install [<@scope>/]<name>@<tag>
4 npm install [<@scope>/]<name>@<version>
5 npm install [<@scope>/]<name>@<version range>
6 npm install <git-host>:<git-user>/<repo-name>
7 npm install <git repo url>
8 npm install <tarball file>
9 npm install <tarball url>
10 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。
例如:
1 sync-files -w ./src ../other-project/node_modules/your-package/src