Вопрос или проблема
Я работаю над веб-приложением, которое использует внутренние пакеты 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
Объяснение команды:
-
(.dependencies,.devDependencies)
: Мы выбираем два объекта —dependencies
иdevDependencies
. -
|= with_entries(...)
: Используемwith_entries
, чтобы перебрать каждую запись в этих объектах. Это позволяет применять изменения к каждой зависимости. -
if .key | startswith("@glen/")
: Проверяем, начинается ли ключ зависимости с префикса@glen/
. -
then .value | gsub("(-dev.3|-rc.0)"; "")
: Если условие выполнено, используемgsub
для замены содержимого значения — удаляем-dev.3
и-rc.0
. -
else .value
: Если ключ не начинается с@glen/
, оставляем значение без изменений. -
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/
.