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:

  1. a folder containing a program described by a package.json file
  2. a gzipped tarball containing (1)
  3. a url that resolves to (2)
  4. a <name>@<version> that is published on the registry (see npm-registry) with (3)
  5. a <name>@<tag> (see npm-dist-tag) that points to (4)
  6. a <name> that has a “latest” tag satisfying (5)
  7. 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/@xxx:registry=http://registry.npm.xxx.com

那么,在package.json中以"@xxx/xxx": ""方式书写的package都会使用不同的仓库。

npm install

除了package.json,这里也列举以下npm install可以接受的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
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。

例如:

1
sync-files -w ./src ../other-project/node_modules/your-package/src