Обновите package.json с помощью jq.

Вопрос или проблема

Я работаю над веб-приложением, которое использует внутренние пакеты npm. Эти пакеты имеют названия, начинающиеся с префикса @glen/

Задача состоит в том, чтобы разобрать и изменить файл package.json, удалив теги -dev.3 и -rc.0 специально для префикса @glen/.

Пример:
“@glen/manager”: “^3.0.0-rc.0”, -> “@glen/manager”: “^3.0.0”,

Я ожидаю использовать jq, но любые другие предложения, работающие на Linux, приветствуются!

Оригинальный файл package.json:

    {
      "name": "@glen/web_trans",
      "version": "1.0.0",
      "scripts": {
        "build": "nuxt build",
        "dev": "nuxt dev",
        "generate": "nuxt generate",
        "prepare": "husky install"
      },
      "devDependencies": {
        "@glen/manager": "^3.0.0-rc.0",
        "@glen/handler": "^1.3.6",
        "@glen/extension": "^3.3.0-dev.3",
        "@nuxt/devtools": "^1.0.0-beta.2",
        "@nuxtjs/device": "^3.1.1",
        "@nuxtjs/i18n": "^8.0.0-rc.5",
        "eslint": "^8.29.0",
        "husky": "^8.0.0",
        "jsdom": "^21.1.1",
        "nuxt": "3.7.4",
        "vitest": "^0.29.7"
      },
      "dependencies": {
        "@glen/manager": "^3.0.0-rc.0",
        "@glen/handler": "^1.3.6",
        "@glen/extension": "^3.3.0-dev.3",
        "@pinia/nuxt": "^0.4.6",
        "@vee-validate/rules": "^4.11.3",
        "@vue/apollo-composable": "^4.0.0-beta.1",
        "@vue/eslint-config-typescript": "^11.0.2",
        "@vueuse/components": "^9.6.0",
        "@vueuse/core": "^9.6.0",
        "websocket": "^1.0.34"
      },
      "extensionPack": [
        "Vue.volar"
      ],
      "overrides": {
        "vue": "latest"
      }
    }

После обновления он должен выглядеть так:

    {
      "name": "@glen/web_trans",
      "version": "1.0.0",
      "scripts": {
        "build": "nuxt build",
        "dev": "nuxt dev",
        "generate": "nuxt generate",
        "prepare": "husky install"
      },
      "devDependencies": {
        "@glen/manager": "^3.0.0",
        "@glen/handler": "^1.3.6",
        "@glen/extension": "^3.3.0",
        "@nuxt/devtools": "^1.0.0-beta.2",
        "@nuxtjs/device": "^3.1.1",
        "@nuxtjs/i18n": "^8.0.0-rc.5",
        "eslint": "^8.29.0",
        "husky": "^8.0.0",
        "jsdom": "^21.1.1",
        "nuxt": "3.7.4",
        "vitest": "^0.29.7"
      },
      "dependencies": {
        "@glen/manager": "^3.0.0",
        "@glen/handler": "^1.3.6",
        "@glen/extension": "^3.3.0",
        "@pinia/nuxt": "^0.4.6",
        "@vee-validate/rules": "^4.11.3",
        "@vue/apollo-composable": "^4.0.0-beta.1",
        "@vue/eslint-config-typescript": "^11.0.2",
        "@vueuse/components": "^9.6.0",
        "@vueuse/core": "^9.6.0",
        "websocket": "^1.0.34"
      },
      "extensionPack": [
        "Vue.volar"
      ],
      "overrides": {
        "vue": "latest"
      }
    }

jq '(.dependencies,.devDependencies) |=
        with_entries(.value = if .key | startswith("@glen/")
                              then  .value | split("-")[0]
                              else .value
                              end)
   ' file.json

Ответ или решение

Чтобы обновить файл package.json, удалив теги -dev.3 и -rc.0 из зависимостей с префиксом @glen/, мы можем использовать jq, мощный инструмент для обработки JSON.

Вот команда jq, которая выполнит необходимую модификацию:

jq '(.dependencies,.devDependencies) |= with_entries(
    if .key | startswith("@glen/")
    then .value | gsub("(-dev.3|-rc.0)"; "")
    else .value
    end
)' package.json > package_updated.json

Объяснение команды:

  1. (.dependencies,.devDependencies): Мы выбираем два объекта — dependencies и devDependencies.

  2. |= with_entries(...): Используем with_entries, чтобы перебрать каждую запись в этих объектах. Это позволяет применять изменения к каждой зависимости.

  3. if .key | startswith("@glen/"): Проверяем, начинается ли ключ зависимости с префикса @glen/.

  4. then .value | gsub("(-dev.3|-rc.0)"; ""): Если условие выполнено, используем gsub для замены содержимого значения — удаляем -dev.3 и -rc.0.

  5. else .value: Если ключ не начинается с @glen/, оставляем значение без изменений.

  6. package.json > package_updated.json: Читаем входной файл package.json и записываем измененный JSON в новый файл package_updated.json.

Пример:

Если исходный файл выглядит следующим образом:

{
  "devDependencies": {
    "@glen/manager": "^3.0.0-rc.0",
    "@glen/extension": "^3.3.0-dev.3",
    "eslint": "^8.29.0"
  },
  "dependencies": {
    "@glen/handler": "^1.3.6"
  }
}

После выполнения команды мы получим:

{
  "devDependencies": {
    "@glen/manager": "^3.0.0",
    "@glen/extension": "^3.3.0",
    "eslint": "^8.29.0"
  },
  "dependencies": {
    "@glen/handler": "^1.3.6"
  }
}

Альтернативный способ:

Если вы предпочитаете использовать Node.js, вы можете создать простой скрипт для достижения той же цели. Пример кода на Node.js:

const fs = require('fs');

const data = JSON.parse(fs.readFileSync('package.json', 'utf8'));

['dependencies', 'devDependencies'].forEach(depType => {
  if (data[depType]) {
    Object.keys(data[depType]).forEach(key => {
      if (key.startsWith('@glen/')) {
        data[depType][key] = data[depType][key].replace(/-dev\.3|-rc\.0/g, '');
      }
    });
  }
});

fs.writeFileSync('package_updated.json', JSON.stringify(data, null, 2));

Этот скрипт выполнит аналогичную логику и создаст файл package_updated.json с обновленными значениями.

Заключение:

Используя jq или Node.js, вы можете эффективно обновить файл package.json и избавиться от нежелательных тегов в зависимостях с префиксом @glen/.

Оцените материал
Добавить комментарий

Капча загружается...