3

我在 npm 上创建了一个包,它创建了一个“scss 目录结构”,我想将自定义脚本复制/添加到项目根目录的 package.json 文件中。

MY-PROJECT
├── node_modules
├── scss
└── package.json <--

我所能做的就是将文件名“package.json”复制到本地目录,但如果已经有一个,它将覆盖它。

显然我不想覆盖该文件,而只想添加像“npm run watch”这样的脚本。因此,用户将能够立即开始其项目,而无需自己编写这些脚本。

谢谢您的帮助

4

3 回答 3

2

使用以下 node.js 脚本:

安装后.js

const saveFile = require('fs').writeFileSync;

const pkgJsonPath = require.main.paths[0].split('node_modules')[0] + 'package.json';

const json = require(pkgJsonPath);

if (!json.hasOwnProperty('scripts')) {
  json.scripts = {};
}

json.scripts['watch'] = '<some_commands_here>';

saveFile(pkgJsonPath, JSON.stringify(json, null, 2));

包.json

scripts你的package.json部分定义你的postinstall脚本如下:

{
  "scripts": {
    "postinstall": "node post-install"
  }
}

注意: npm 脚本(上面)假设与您的文件post-install.js位于同一目录中。package.json


解释:

  1. 在如下代码行中:

    const pkgJsonPath = require.main.paths[0].split('node_modules')[0] + 'package.json'
    

    我们为正在使用您的 npm 包的项目获取package.json的路径,并将其分配给pkgJsonPath变量。

    • require.main.paths返回一个路径名数组。

    • 我们在索引处获取路径名,0并将split()node_modules用作分隔符。

    • index 处的结果数组元素0为我们提供了项目目录的路径名(即,正在使用您的 npm 包的项目的路径名)。

    • 最后,package.json使用加号运算符 ( ) 连接字符串+

  2. 接下来我们require打开package.json文件并将解析后的 JSON 分配给json变量。

  3. 然后我们检查package.json是否有scripts键,如果没有,我们创建一个新的scripts属性/键并为其分配一个空对象,即

    if (!json.hasOwnProperty('scripts')) {
      json.scripts = {};
    }
    
  4. 以下部分是我们定义要添加到package.json文件的自定义 npm 脚本的地方 - 您需要根据需要更改此部分:

    json.scripts['watch'] = '<some_commands_here>';
    
  5. 最后,我们JSON.stringify()使用新数据json覆盖原始package.jsonfs.writeFileSync()文件。

于 2020-05-06T12:27:45.607 回答
1

您可以编写小脚本并在脚本中添加命令或修改package.json

脚本.js

const json = require("./package.json")
json.scripts["run:watch"] = "npm run watch"
require("fs").writeFileSync(process.cwd() + "/package.json", JSON.stringify(json, null, 2))

包.json

{
"scripts": {
    "postinstall": "node script.js"
  }
}

您还可以编写示例脚本内联字符串,并使用node -e

{
"scripts": {
    "postinstall": "node -e 'const json = require(\"./package.json\"); json.scripts[\"run:watch\"] = \"npm run watch\";require(\"fs\").writeFileSync(process.cwd() + \"/package.json\", JSON.stringify(json, null, 2))'"
  },
}
于 2020-05-05T17:01:19.033 回答
0

我有一个类似的问题。如果您需要编辑根 package.json,而您的带有“postinstall”脚本的模块作为 npm 依赖项安装在某些使用者项目中,那么只要没有解析 package.json,您就需要在父目录中查找

const fs = require('fs');
const path = require('path');

let rootPath = '../';
while (!fs.existsSync(path.resolve(rootPath, 'package.json'))){
  rootPath += '../';
}
const pkgJsonPath = path.resolve(rootPath, 'package.json');
于 2021-08-15T11:14:14.763 回答