npm发包

727 阅读3分钟

注册npm

https://www.npmjs.com/

获取账号密码

添加npm账号

1. npm addUser // 添加个人npm
2. npm whoami
3. 查看目前的源
nrm current
或
npm config get registry

发包

到个人项目下,执行

npm publish

程序执行完,发布成功提示

1

在 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()