组件发布新版本至线上
项目环境 vue 2
1. 在 build 文件夹下新建文件 npm-auth.js 内容如下:
const registry = '' // 要发布的线上地址 const alwaysAuth = true function getNpmAuth (username, password) { const userStr = `${username}:${password}` const _auth = Buffer.from(userStr).toString('base64') const npmAuth = `registry=${registry} always-auth=${alwaysAuth} _auth="${_auth}"` return npmAuth } module.exports = getNpmAuth
2. 在 build 文件夹下新建文件 publish.js 内容如下:
const fs = require('fs') const exec = require('child_process').exec; var initData, publishData; var execute = function (cmd) { exec(cmd, function (error) { if (error) { console.error(error); } else { console.log('success'); } }); } // 读取package.json fs.readFile('../package.json', function (err, data) { if (err) { return console.error(err); } initData = JSON.parse(data).dependencies }); fs.readFile('./package.json', function (err, data) { if (err) { return console.error(err); } // 读取版本号 publishData = JSON.parse(data) let version = publishData.version let arr = [] for (let i of version.split('.')) { arr.push(parseInt(i)) } let [a, b, c] = arr if (c + 1 >= 100) { c = 0 b++ if (b >= 100) { a++ b = 0 } } else { c++ } let newVersion = `${a}.${b}.${c}` publishData.version = newVersion Object.assign(publishData.dependencies, initData) fs.writeFile('./package.json', JSON.stringify(publishData), err => { if (err) throw err; console.log('写入成功'); execute('npm config set registry http:///nexus/repository') // 此处替换发布地址 execute('npm publish') }) });
3. 在 build 文件夹下新建文件 publishNew.js 内容如下:
/** * 组件发布执行命令 * node build/publishNew.js */ const fs = require('fs') const path = require('path') const inquirer = require('inquirer') const shelljs = require('shelljs') const packageName = 'my-app' const promptList = [ { type: 'input', message: '账号: ', name: 'username' }, { type: 'password', message: '密码: ', name: 'password' } ] function resolve (dir) { return path.join(__dirname, '..', dir) } function rewriteNpmrc ({ username, password }) { const npmAuth = require('./npm-auth.js')(username, password) fs.writeFileSync(resolve(`/${packageName}/.npmrc`), npmAuth) } const copyFileList = [ { from: resolve(`/${packageName}/.npmrc`), to: resolve(`/${packageName}/lib/.npmrc`) } ] function moveFile () { copyFileList.forEach(item => { const content = fs.readFileSync(item.from, 'utf-8') fs.writeFileSync(item.to, content) }) } function publishNpm () { shelljs.cd(resolve(`/${packageName}/`)) shelljs.exec('npm publish') } inquirer.prompt(promptList) .then(answers => { rewriteNpmrc(answers) moveFile() publishNpm() })
4. 构建产物
npm run build
构建后文件目录如图所示:
5. package.json 修改版本号
6. 发布产物 (会出现交互,输入有权限上传的账号密码)
node build/publishNew.js
7. 其他
若发布失败,可能是当前版本已存在。
也可构建后,直接上传到制品库