Как я могу отредактировать package. json с помощью postinstall - PullRequest
1 голос
/ 05 мая 2020

Я создал пакет на npm, который создает «структуру каталога s css», и я хотел бы скопировать / добавить пользовательские скрипты в пакет. json файл в root проекта.

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

Все, что мне удалось сделать, это скопировать имя файла «package. json» в локальный каталог, но если он уже существует, он перезапишет его.

Очевидно, я не хочу перезаписывать этот файл, а только добавляю скрипты вроде «npm run watch». Таким образом, пользователь сможет сразу приступить к работе над своим проектом без необходимости писать эти скрипты самому.

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Используйте следующий сценарий 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 вашего пакета . 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'
    

    , мы получаем путь к пакету . json для проекта, который использует ваш пакет npm и назначьте его переменной pkgJsonPath.

    • require.main.paths возвращает массив имен путей.

    • Мы получаем путь по индексу 0 и split(), используя node_modules в качестве разделителя.

    • Результирующий элемент массива по индексу 0 дает нам путь к каталогу проекта (т.е. путь к проекту, суммируя ваш пакет npm).

    • Наконец, строка package.json объединяется с использованием оператора плюс (+).

  2. Затем мы require пакет . json файл и назначаем проанализированный JSON переменной json.

  3. Затем мы проверяем, есть ли в пакете . json ключ scripts, и если его нет, мы создаем новое свойство / ключ scripts и назначаем ему пустой объект, т.е.

    if (!json.hasOwnProperty('scripts')) {
      json.scripts = {};
    }
    
  4. В следующей части мы определяем настраиваемый сценарий npm, который будет добавлен в пакет . * Файл 1121 * - вам нужно будет изменить эту часть по мере необходимости:

    json.scripts['watch'] = '<some_commands_here>';
    
  5. Наконец, мы JSON.stringify() объект json и перезаписываем исходный пакет . json файл с новыми данными, используя fs.writeFileSync().

0 голосов
/ 05 мая 2020

Вы можете написать небольшой скрипт и добавить команду в скрипт или изменить 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))'"
  },
}
...