场景:
npm包批量上传到Nexus
问题描述
在大型项目中,我们可能会有很多自定义的npm包需要管理。手动一个接一个地上传这些包会非常耗时,而且容易出错。这时,我们可以利用一些工具或者脚本来实现npm包的批量上传
解决方案:
一、批量调用Nexus Api 接口
const fs = require('fs');
const axios = require('axios');
async function uploadPackages() {
try {
const packages = [
{ name: 'package1', path: '/path/to/package1.tgz' },
{ name: 'package2', path: '/path/to/package2.tgz' },
// 添加更多的包
];
for (let i = 0; i < packages.length; i++) {
const { name, path } = packages[i];
const packageData = fs.readFileSync(path);
const formData = new FormData();
formData.append('name', name);
formData.append('package', packageData);
const response = await axios.post('http://nexus-api-url/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
});
console.log(`Package ${name} uploaded successfully.`);
}
} catch (error) {
console.error('An error occurred while uploading packages:', error);
}
}
uploadPackages();
二、使用npm-registry-client
npm-registry-client是一个Node.js库,用于与npm注册表交互。我们可以用它来自动化npm包的上传过程。
首先,你需要安装这个库:
bash
npm install npm-registry-client
然后,你可以创建一个简单的脚本,如下所示:
javascript
const Client = require('npm-registry-client');
const client = new Client();
async function uploadPackage(name, version) {
try {
await client.add({
auth: { token: 'your-npm-token' },
name,
version,
dist: {
tarball: `https://nexus.example.com/repository/npm-group/${name}-${version}.tgz`
}
});
console.log(`${name}@${version} uploaded.`);
} catch (err) {
console.error(`Failed to upload ${name}@${version}:`, err);
}
}
// List your packages here:
const packages = [
{ name: 'package1', version: '1.0.0' },
{ name: 'package2', version: '2.0.0' },
// ...
];
packages.forEach(package => uploadPackage(package.name, package.version));
在这个脚本中,你需要将your-npm-token替换为你自己的npm注册表令牌。这个令牌可以在Nexus控制台中生成。
运行这个脚本后,所有的包都会被上传到Nexus。
三、使用conventional-changelog-cli
如果你的项目使用了Conventional Commits规范,并且生成了changelog文件,那么你可以使用conventional-changelog-cli来自动提取新版本的信息,并基于这些信息创建和上传新的npm包。
首先,你需要安装这个库:
bash
npm install conventional-changelog-cli
然后,你可以创建一个类似于上述的脚本,但是这次你可以在changelog文件中提取新版本的信息,而不需要手动指定每个包的名称和版本。