npm 发布 - 从 package.json 中删除脚本?

2024-01-25

在发布我的脚本之前,我在 package.json 下有许多脚本来编译咖啡脚本、打字稿和仅限开发人员的命令 - 一旦发布就没有任何意义。

我想知道是否有删除 package.json 下某些脚本的程序?考虑到在发布包时,它也会发布 package.json。

在发布包之前是否可以删除脚本?

发布脚本后,我会删除许多 typescript 和 Coffeescript 源文件(因为它们已编译),因此我用于构建 no 的脚本对于已发布的包没有任何意义。

这可行吗?或者我应该考虑另一种方式?


简短的回答。

“在发布包之前是否可以删除脚本?”

npm 不包含从中删除脚本的内置功能package.json.


长答案和解决方案。

“这样可行吗?还是我应该想想别的办法?”

有几个内置功能称为前钩和后钩 http://www.marcusoft.net/2015/08/pre-and-post-hooks-for-npm-scripting.html可以用来满足您的要求,尽管是以相当定制的方式。相关的钩子是prepublish and postpublish并在中描述文档 https://docs.npmjs.com/misc/scripts如下;

预发布:在包打包和发布之前运行,以及在本地运行npm install没有任何争论...

发布后:在包发布后运行。

解决方案的概要是:

  1. 利用一个prepublish您项目中的脚本package.json调用自定义nodejs脚本。这nodejs脚本执行以下操作:

    • 读了原著package.json数据并缓存它。
    • 从中删除特定的脚本/键scripts的部分package.json.
    • 将修改后的数据写回原来的数据package.json.
  2. 利用一个postpublish您项目中的脚本package.json调用另一个自定义nodejs脚本。这个二级nodejs脚本执行以下操作:

    • 恢复内容package.json回到原来的状态。

代码示例/要点。

  1. 下列nodejs脚本将执行上面第一点中提到的任务。让我们命名它cleanse-pkg.js.

    clean-pkg.js

    const fs = require('fs');
    const path = require('path');
    
    // Define absolute paths for original pkg and temporary pkg.
    const ORIG_PKG_PATH = path.resolve(__dirname, '../package.json');
    const CACHED_PKG_PATH = path.resolve(__dirname, '../../cached-package.json');
    
    // Obtain original `package.json` contents.
    const pkgData = require(ORIG_PKG_PATH);
    
    if (process.argv.length <= 2) {
      throw new Error('Missing npm scripts key/name argument(s)');
    }
    
    // Get list of arguments passed to script.
    const scriptsToRemove = process.argv[2].split(',');
    const devDepsToRemove = process.argv[3] ? process.argv[3].split(',') : [];
    
    // Write/cache the original `package.json` data to `cached-package.json` file.
    fs.writeFile(CACHED_PKG_PATH, JSON.stringify(pkgData), function (err) {
      if (err) throw err;
    });
    
    // Remove the specified named scripts from the scripts section.
    scriptsToRemove.forEach(function (scriptName) {
      delete pkgData.scripts[scriptName];
    });
    
    // Remove the specified named pkgs from the devDependencies section.
    devDepsToRemove.forEach(function (pkgName) {
      delete pkgData.devDependencies[pkgName];
    });
    
    // Overwrite original `package.json` with new data (i.e. minus the specific data).
    fs.writeFile(ORIG_PKG_PATH, JSON.stringify(pkgData, null, 2), function (err) {
      if (err) throw err;
    });
    
  2. 以下次要nodejs脚本将执行上面第二点提到的任务。我们来命名这个restore-pkg.js.

    恢复-pkg.js

    const fs = require('fs');
    const path = require('path');
    
    // Define absolute paths for original pkg and temporary pkg.
    const ORIG_PKG_PATH = path.resolve(__dirname, '../package.json');
    const CACHED_PKG_PATH = path.resolve(__dirname, '../../cached-package.json');
    
    // Obtain original/cached contents from `cached-package.json`.
    const pkgData = JSON.stringify(require(CACHED_PKG_PATH), null, 2) + '\n';
    
    // Write data from `cached-package.json` back to original `package.json`.
    fs.writeFile(ORIG_PKG_PATH, pkgData, function (err) {
      if (err) throw err;
    });
    
    // Delete the temporary `cached-package.json` file.
    fs.unlink(CACHED_PKG_PATH, function (err) {
      if (err) throw err;
    });
    

实施和使用。

  1. The prepublish and postpublish脚本在项目中定义package.json如下:

    人为的原始 package.json

    {
      ...
      "scripts": {
        "keep": ... ,
        "a": ... ,
        "b": ... ,
        "prepublish": "node .scripts/cleanse-pkg \"a,b,prepublish,postpublish\"",
        "postpublish": "node .scripts/restore-pkg"
      },
      ...
    }
    
    • 请注意\"a,b,prepublish,postpublish\"部分于prepublish脚本。这定义了要传递给的参数cleanse-pkg.js(即它列出了发布前要删除的每个脚本的名称)。每个要删除的命名脚本必须是;作为单个字符串提供,用逗号分隔,并且不得包含空格。

    • Both cleanse-pkg.js and restore-pkg.js驻留在名为的隐藏文件夹中.scripts,它本身位于项目目录的顶层,(即与项目处于同一级别package.json). Both nodejs可以根据需要重新定位脚本,并根据需要在相应的脚本中重新定义它们的路径npm 脚本 .

  2. 鉴于人为的package.json以上,实际package.json最终发布的 tarball 的内容如下:

    结果/发布的 package.json

    {
      ...
      "scripts": {
        "keep": ...
      },
      ...
    }
    

devDependencies 部分中的包。

也许有列出的软件包devDependencies您的项目的一部分package.json您还希望在已发布的内容中删除该内容package.json.

(注意: 中列出的任何软件包开发依赖 https://docs.npmjs.com/files/package.json#devdependencies不过,当用户通过 npm-registry 安装时,不会下载该部分).

但是,也许您还是想删除它们。如果这是一个要求,那么cleanse-pkg.js还接受可选的第二个参数。该参数类似于第一个参数,即每个命名包要从devDependencies部分必须是;作为单个字符串提供,用逗号分隔,并且不得包含空格。

  1. 我们假设原来的package.json这次如下:

    人为的原始 package.json

    {
      ...
      "scripts": {
        "keep": ... ,
        "a": ... ,
        "b": ... ,
        "prepublish": "node .scripts/cleanse-pkg \"a,b,prepublish,postpublish\" \"x,z\"",
        "postpublish": "node .scripts/restore-pkg"
      },
      "devDependencies": {
        "x": "^1.0.2",
        "y": "^0.8.1",
        "z": "^0.8.1"
      },
      ...
    }
    
    • 注意额外的第二个\"x,z\"参数添加到prepublish脚本来指定要从devDependecies部分。
  2. 这次,考虑到人为的package.json以上,实际package.json最终发布的 tarball 的内容如下:

    结果/发布的 package.json

    {
      ...
      "scripts": {
        "keep": ...
      },
      "devDependencies": {
        "y": "^0.8.1"
      },
      ...
    }
    

Running

该解决方案假设npm 发布 https://docs.npmjs.com/cli/publish将使用以下方法之一运行:

  1. 来自项目目录内,不带任何参数。例如。npm publish.
  2. 指定项目的路径package.json. E.g. npm publish path/to/package.json.

通过提供包含单个文件夹的 gzip 压缩 tar 存档的 url 或文件路径是行不通的。package.json里面的文件。


补充笔记

  1. 为了防止这两种效用nodejs脚本,(cleanse-pkg.js and restore-pkg.js),从发布开始,它们应该添加到您的项目中.npmignore https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package文件。鉴于上面解释的这两个文件的位置,您可以添加.scripts进入.npmignore.

  2. 两者都有实用性nodejs脚本,cleanse-pkg.js and restore-pkg.js, 定义:

    • 原始路径的绝对路径package.json file.
    • 临时路径的绝对路径cached-package.json文件应该被写入。目前,它保存在项目目录的上一级/外部,以避免被发布)。

    如果您选择存储cleanse-pkg.js and restore-pkg.js到与上述位置不同的位置,以下代码片段中的路径将需要根据需要在两个文件中重新定义。

    const ORIG_PKG_PATH = path.resolve(__dirname, '../package.json');
    const CACHED_PKG_PATH = path.resolve(__dirname, '../../cached-package.json');
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

npm 发布 - 从 package.json 中删除脚本? 的相关文章

随机推荐