使用 libnpm 以编程方式打包和发布 NPM 包

Programmatically pack and publish NPM package with libnpm

我想在我的 CI/build 系统中发布到 NPM,所以我发现 libnpmpublish 这似乎是正确的工具,但 明确指出 它不会将您的代码打包到压缩包中,尽管 publish API 要求您将其传递给压缩包(与文件夹或路径相比)。

他们建议的解决方案是

Since libnpmpublish does not generate tarballs itself, one way to build your own tarball for publishing is to do npm pack in the directory you wish to pack. You can then fs.createReadStream('my-proj-1.0.0.tgz') and pass that to libnpmpublish, along with require('./package.json').

是否有编程(在 Node 中)方式来编写此过程的脚本?我环顾了 NPM 存储库,但找不到专门用于打包的包,尽管我可以找到 this code,它似乎实现了打包,但在存档存储库中——也就是说,它不是 libnpm.

我能找到的最接近的是 npm-packlist,当给定一个文件夹时,它会创建一个可以转发到 NPM tar 包的文件列表,如 npm-packlist.

这有点像使用命令行的 hack,但它适用于我通过 REST 命令创建和上传包的类似概念。我承诺 returns 一个流,这样我就可以轻松地将其添加到 formPost 数据中:

const exec = require('child_process').exec;
return new Promise((resolve, reject) => {
    exec(`npm pack ${t}`, { cwd: d }, (error, stdout, stderr) => {
        if (error) {
            console.error(error);
            reject(error);
        }
        var f = d + p.sep + stdout.trim();
        if (debug) console.log(`zip file "${f}" created.`);
        resolve(fs.createReadStream(f))
    });
});

尽情享受吧!

现在有 libnpmpack,它将以 libnpmpublish 期望的格式生成压缩包缓冲区,因此可以通过以下方式完成:

const pack = require('libnpmpack')
const { publish } = require('libnpmpublish')

async function packAndPublish(packagePath) {
  // readPackageJson omitted for brevity
  const manifest = readPackageJson(packagePath)

  const tarball = await pack(packagePath)
  return publish(manifest, tarball)
}