Scoped Packages 域级包
在 npm 的包管理系统中,有一种 scoped packages 机制,用于将一些 packages 以 @scope/package
的命名形式集中在一个命名空间下面,实现域级的包管理。
这就是我们看到的诸如 @angular/core
、@angular/router
、@r/horse
等 package 的存在形态。
那么如何创建和管理这种域级包(其实是小生自己译的名儿,不喜勿怪,嘻嘻)呢。Steps steps go~
在 npm 项目中设置 scope
npm 会在用户注册账号的时候为其自动创建一个与用户名同名的 scope,之后用户也可以创建其他的 Org 作为 scope。
下面以用户独有的作用域为例:
$ mkdir scoped-packages-demo && cd scoped-packages-demo
# 这里是小生的 npm 用户名
$ npm init --scoped=shockw4ver
然后一顿回车搞定初始化(或者直接加 -y
参数~),当然你也可以精致的填好每一个信息,方便回顾~
操作 scope
初始化成功以后,package.json
文件中的 name
值为 @shockw4ver/scoped-packages-demo
,即这个包是位于 shockw4ver
命名空间下的 scoped-packages-demo
。
如果你想一直在这个 scope 下开发 npm 包,可以运行全局的 npm 配置命令进行设置:
$ npm config set scope shockw4ver
此时运行 npm config list
,可以看到:
; cli configs
metrics-registry = "https://registry.npmjs.org/"
scope = "@shockw4ver"
user-agent = "npm/5.5.1 node/v8.9.3 darwin x64"
; userconfig /Users/zhangyongchao/.npmrc
//registry.npm.taobao.org/:always-auth = false
//registry.npm.taobao.org/:email = "asambojur@live.cn"
//registry.npm.taobao.org/:username = "shockw4ver"
@asambojur:registry = "https://registry.npmjs.org/"
registry = "https://registry.npmjs.org/"
; node bin location = /usr/local/bin/node
; cwd = /Users/zhangyongchao/Desktop/Samuel/demos
; HOME = /Users/zhangyongchao
; "npm config ls -l" to show all defaults.
这是已经将 scope 写到了 .npmrc 中去,作为全局的 npm 配置。
发布 scoped package
scoped package 的发布与普通 package 的发布几乎没有区别,只是需要注意设置权限:
$ npm adduser
Username: shockw4ver
Password:
Email: (this IS public) asambojur@live.cn
Logged in as shockw4ver to scope @asambojur on https://registry.npmjs.org/.
$ npm publish --access=public
# 这里需将访问权限设置为 public,否则它默认是发布一个 private module,这是为一个有偿服务,需要成为“paid user”。
稍等片刻:
+ @shockw4ver/scoped-packages-demo@1.0.0
这便是发布成功了,嘿嘿~
合作开发
合作开发和普通包就更没区别~
owner 只需将合作者添加到 collaborator 即可~
当然了,之前应当先用版本管理工具做好同步,确保每次发布版本号不重复。
Private Modules
这里赘述一下 Private Modules 吧~
它是 npm 提供的私有模块服务,类似于 github 的 private repository。
当你的命名空间下的代码不想公开而又希望用 npm 进行管理的时候,可以有偿的使用这个服务。
官方描述:
When you sign up for private modules as an individual user, your scope is your username. If you create an npm Org, the orgname can be the scope. Orgs can be free or paid. Using a public Org is the only free way to use scopes in package names
也就是说,个人用户名或 Org 都可以成为你的 scope,而 Orgs 可以是付费或者免费的,其中免费 Org 是通过包名使用 scope 的唯一途径