离线安装npm私仓包

1,609 阅读1分钟

前言

新接到一个需求,需要交付源码,但是项目中依赖了几个私仓的npm包。但是这个私仓的包不能发到公网上。所以需要一个解决办法,需要能将将这几个包直接将依赖的项目中。

解决办法

尝试了多种方式,找到了一种较为可行的办法。

  1. 咱们需要全局安装一个npm包npm i -g npm-pack-all
  2. 在项目根目录执行npm i安装依赖。
  3. node_modules中找到自己依赖的私仓包。去它的目录下执行npm-pack-all命令会生成一个tgz格式的压缩文件。
  4. 然后将这个压缩包拷贝到你想要放置的位置,然后执行npm i tgz文件所在的路径。然后就可以将这个压缩包安装到项目中了。
  5. 最后就可以将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.jsonscript中添加一条postinstall: "node install.js".这样在安装依赖完成之后就不需要手动再去安装私仓包了。