前言
新接到一个需求,需要交付源码,但是项目中依赖了几个私仓的npm包。但是这个私仓的包不能发到公网上。所以需要一个解决办法,需要能将将这几个包直接将依赖的项目中。
解决办法
尝试了多种方式,找到了一种较为可行的办法。
- 咱们需要全局安装一个npm包
npm i -g npm-pack-all。 - 在项目根目录执行
npm i安装依赖。 - 去
node_modules中找到自己依赖的私仓包。去它的目录下执行npm-pack-all命令会生成一个tgz格式的压缩文件。 - 然后将这个压缩包拷贝到你想要放置的位置,然后执行
npm i tgz文件所在的路径。然后就可以将这个压缩包安装到项目中了。 - 最后就可以将package.json中的私仓安装信息即可。
这样就达成了npm离线安装私仓包的要求了。
优化方式
这里我写了俩个nodeJS脚本优化操作体验
脚本一
const fs = require("fs");
const scopeArr = ['@xxxxx','@xxxxx'];
// 这里可以配置一个npm作用域。如果你的包不在一个作用域。那这个脚本就需要重新修改一下了。
scopeArr.forEach(scope=>{
function createTgz(fileName){
const exec = require("child_process").exec;
const cmd = `npm-pack-all --output ../../../package/${fileName}.tgz`;
const cwd = `${__dirname}/node_modules/${scope}/${fileName}`;
exec(cmd, { cwd }, function(error, stdout, stderr) {
if (error) {
console.log(stderr);
return;
}
console.log(`run ${cwd} successfully`);
});
}
const pathName = `${__dirname}/node_modules/${scope}`;
fs.readdir(pathName, function(err, files) {
files.forEach((item) => {
createTgz(item);
});
});
})
这个脚本的实现的效果是将node_modules下某个作用域内的所有的包,分别压缩到项目根目录下的package目录下。
脚本二
const fs = require("fs");
const pathName = `${__dirname}/package`;
fs.readdir(pathName, function(err, files) {
files.forEach((item) => {
const exec = require("child_process").exec;
const cmd = `npm i ${__dirname}/package/${item}`;
const cwd = `${__dirname}`;
exec(cmd, { cwd }, function(error, stdout, stderr) {
if (error) {
console.log(stderr);
return;
}
console.log(`run ${cwd} successfully`);
});
});
});
这个脚本的作用是将package目录下的压缩包安装到项目中。
这里可以在package.json的script中添加一条postinstall: "node install.js".这样在安装依赖完成之后就不需要手动再去安装私仓包了。