注册npm
https://www.npmjs.com/
获取账号密码
添加npm账号
1. npm addUser // 添加个人npm
2. npm whoami
3. 查看目前的源
nrm current
或
npm config get registry
发包
到个人项目下,执行
npm publish
程序执行完,发布成功提示
在 npm官网,就可以查找自己的项目
这里有几个小问题:
1. 项目名 / 项目版本是由哪里决定的
{
"name": "azhu-node-project", // 项目名
"version": "1.0.0", // 版本号
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "azhu",
"license": "ISC"
}
2. 发包未成功,怎么解决
分为:
- 有提示
按报错提示解决
- 无提示
常见的就是直接有一个403报错,其他啥也没有。有些源,包的版本未升级,直接发布,只会报一个403,修改下包的版本号就可以了。
大致解决问题的方向是:包的版本未修改直接发布/检查下账户
3. 私有包如何发布
什么是私有包?
@azhu/node-project
发布私有包:
{
"name": "@azhu/node-project", // group + 包名
"version": "1.0.0",
// ...
}
发布!
提示私有包需要购买~
4. 已经发布的包是否可删除
网上众说纷纭,我自己的发布的包是可以删除。可能测试包没人用的原因。不管能不能删除 要 ==谨慎执行== 这行代码。
npm unpublish @azhu --force
删除过的包,24小时之内不能在发。
5. 作废指定包的指定版本
npm deprecate <pkg>[@<version>] <message>
beta版&正式版
npm publish // 正式版
npm publish --tag beta // 测试版
执行 npm publish --tag beta 命令
查看包信息:registry.npmjs.org/
{
"_id": "azhu-node-pack",
"name": "azhu-node-pack",
"dist-tags": { // ⚠️ 查看 beta / 正式 版本
"beta": "1.0.0",
"latest": "1.0.0"
},
// ...
}
或者执行命令 npm info 查看
beta版本每次发布也需要更改包版本的!
npm version
每一个 npm 包都有一个 package.json,这个文件中有version字段,表示包的版本号。
version 字段结构是有三位的版本号, 如:0.0.1, 对应为 major, minor, patch
正式发布:
npm version major // 发布大版本的时候会升级为1.0.0
npm version minor // 小版本是0.1.0
npm version patch // 一些小修复是0.0.2
预发布
npm version prepatch // 由 2.1.1 变成 2.1.2-0;再执行一次,2.1.2-0 变成2.1.3-0。即 小修复的 版本在切换
npm version preminor // 由 2.1.3-0 变成 2.2.0-0;再执行一次,2.2.0-0 变成2.3.0-0。即小版本切换
npm version premajor // 由 2.3.0-0 变成 3.0.0-0,再执行一次,由3.0.0-0 变成 4.0.0-0。即大版本切换
npm version prerelease // 4.0.0-1 最后一位递增,4.0.0-2...
自己的项目如何应用beta版本/正式包
beta版本的包不适合应用在项目中,安装包通过 npm install 安装的是稳定版,也就是 dist-tags 中的 lastest 版本
在我们开发包时候,会有测试包和正式包之说,beta包就可以作为我们开发阶段/修改bug阶段来使用的包。
自己实现的一个发包脚本
const args = require('minimist')(process.argv.slice(2))
const chalk = require('chalk')
const semver = require('semver')
const currentVersion = require('../package.json').version
const { prompt } = require('enquirer')
const execa = require('execa')
const pkgName = require('../package.json').name
if (!pkgName) return
const step = (msg1, msg2) => {
console.log(chalk.cyan(msg1), msg2 && chalk.green(msg2) || '')
}
const versionIncrements = [
'patch',
'minor',
'major',
'prepatch',
'preminor',
'premajor',
'prerelease'
]
const inc = i => semver.inc(currentVersion, i)
const run = (bin, args, opts = {}) =>
execa(bin, args, { stdio: 'inherit', ...opts })
let betaTag = ''
process.argv.forEach(item => {
if (/--beta/.test(item)) betaTag = item.split('=')[1]
})
async function main() {
let targetVersion = args._[0]
if (!targetVersion) {
// no explicit version, offer suggestions
const { release } = await prompt({
type: 'select',
name: 'release',
message: 'Select release type',
choices: versionIncrements.map(i => `${i} (${inc(i)})`).concat(['custom'])
})
if (release === 'custom') { // 自定义版本
targetVersion = (await prompt({
type: 'input',
name: 'version',
message: 'Input custom version',
initial: currentVersion
})).version
} else {
targetVersion = release.match(/\((.*)\)/)[1]
}
}
if (!semver.valid(targetVersion)) {
throw new Error(`invalid target version: ${targetVersion}`)
}
const { yes } = await prompt({
type: 'confirm',
name: 'yes',
message: `Releasing v${targetVersion}. Confirm?`
})
if (!yes) {
return
}
// step('\nRunning tests...')
// ...
step('\nUpdating cross dependencies...')
await run('yarn', ['install'])
step('\nBuilding package...')
await run('yarn', ['gulp'])
step('\nPublishing...')
await run(
'yarn',
[
'publish',
'--new-version',
targetVersion,
...(betaTag ? ['--tag', betaTag] : []),
'--access',
'public'
],
{
cwd: './',
stdio: 'pipe'
}
)
step('Successfully published', `${pkgName}@${targetVersion}`)
// push to GitLab
// step('\nPushing to GitLab...')
// await run('git', ['add', '-A'])
// await run('git', ['commit', '-m', `release: v${targetVersion}`])
// await run('git', ['push'])
}
main()