上一篇文章《npm发布包教程(一):从npm提及》中咱们介绍了npm相关的一些知识,旨在让你们对npm有一些深刻的理解,这一篇咱们正式开始演示发布过程。html
在正式开始演示前,咱们还须要作两项准备工做:git
注册地址github
重要!发布scoped包时会用到
npm i nrm -g
nrm是npm仓库管理的软件,可用于npm仓库的快速切换npm
nrm 经常使用命令:json
nrm //展现nrm可用命令 nrm ls //列出已经配置的全部仓库 nrm test //测试全部仓库的响应时间 nrm add <registry> <url> //新增仓库 nrm use <registry> //切换仓库
开始演示前作两个简短说明:
(1)npm官方建议规范的包至少包含:segmentfault
后续的演示都遵循此规范。babel
(2)本次仅演示我的帐户的包发布,包括一个unscoped包和一个scoped的包。团体帐户下的包发布流程和我的帐户差异不大,在此不作展开。ide
yuyy-test-pkg测试
(1)建立工程文件夹网站
mkdir yuyy-test-pkg && cd yuyy-test-pkg
(2)建立package.json
npm init
按照提示一步步完善便可,也可以使用npm init -y
使用npm默认设置,稍后再经过编辑package.json修正。
注意:本次演示的包的入口文件是index.js,请务必确保package.json中字段main对应的值是“index.js”。
最终结果:
{ "name": "yuyy-test-pkg", "version": "1.0.0", "description": "my first npm package", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ "npm", "packge" ], "author": "yuyy", "license": "ISC" }
(3)建立README.md
内容:
### yuyy-test-pkg This is my first npm package! It is just for learning.
(4)建立index.js
内容:
module.exports = { printMsg: function () { console.log('this message is from yuyy-test-pkg!'); } }
最终的目录结构:
└── yuyy-test-pkg ├── README.md ├── index.js └── package.json
npm publish
可能报的错:
(1)未登陆npm ERR!
code ENEEDAUTHnpm ERR!
need auth auth required for publishingnpm ERR!
need auth You need to authorize this machine using npm adduser
解决办法:npm adduser
输入:
(2)仓库地址不对npm ERR!
code E409npm ERR!
Registry returned 409 for PUT on http://r.cnpmjs.org/-/user/or...:yuyy: conflict
缘由:经过nrm ls
命令查看我此时的仓库地址为cnpm,而不是npm
解决办法:用nrm切换到npm仓库,执行命令nrm use npm
以上问题解决后再次执行发布命令npm publish
,发布成功
.
有可能有延迟,不能立马看不到。
@yuyy/babel
(1)建立工程文件夹
mkdir babel && cd babel
(2)建立package.json
npm init
按提示操做,最终结果:
{ "name": "babel", "version": "1.0.0", "description": "my scoped test package", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ "npm", "package" ], "author": "yuyy", "license": "ISC" }
(3)建立README.md
内容:
### @yuyy/babel This is my scoped npm package! It is just for learn.
(4)建立index.js
内容:
module.exports = { printMsg: function () { console.log('this message is from @yuyy/babel!'); } }
最终的目录结构:
└── babel ├── README.md ├── index.js └── package.json
npm publish
报错:没有发布权限npm ERR!
publish Failed PUT 401npm ERR!
code E401npm ERR!
This package requires that publishers enable TFA and provide an OTP to publish. For more info, visit: https://go.npm.me/2fa-guide : babel
缘由:已经存在babel包,而我又不是babel的发布者
解决:包名和域名差很少,先到先得,若是我非要发布一个叫babel的包,只能给它加做用域放到个人命名空间下
npm init --scope=@yuyy -y
@符号后面的是你注册npm帐户时的username,若是不记得能够经过npm whoami
查询。
上面的命令实际上是在从新生成package.json,只是会给包增长了做用域,执行完后package.json如今的内容:
{ "name": "@yuyy/babel", "version": "1.0.0", "description": "my scoped test package", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ "npm", "package" ], "author": "yuyy", "license": "ISC" }
惟一的变化是name字段由原来的babel变成了@yuyy/babel。
npm publish
报错:npm ERR!
publish Failed PUT 402npm ERR!
code E402npm ERR!
You must sign up for private packages : @yuyy/babel
缘由:
npm publish
命令执行,默认是进行私有发布,参见官网publish命令 解决:若是不想花钱,那只能将包面向公共发布,这也符合npm鼓励开源的精神,这一点和GitHub建立仓库相似。
npm publish --access public
执行结果:
值得注意的一点:咱们的项目名是babel,最终发布的包名是@yuyy/babel,可见发布的包名能够和项目名不一致,包名取决于package.json中的name字段。
至此,咱们完成了npm包发布的所有过程,一个unscoped包:yuyy-test-pkg,另外一个scoped包:@yuyy/babel,也包括过程当中可能遇到的问题。发布完咱们本身的包以后,咱们会在下一篇文章《npm发布包教程(三):安装发布包》中介绍安装本身的包和涉及到的一些引用模块相关的知识,以及后续文章中介绍如何对发布过的包进行升级和废弃等。
相关文章:
1.《npm发布包教程(一):从npm提及》
2.《npm发布包教程(二):发布包》
3.《npm发布包教程(三):安装发布包》
4.《npm发布包教程(四):迭代》
5.《npm发布包教程(五):废弃/删除》