我正在尝试编写 bash 脚本来更新 package.json 依赖版本

I am trying to write a bash script to update package.json dependency version

这是我的 package.json 文件

{
    "name": "project-1",
    "version": "1.0.0",
    "description": "TestCafe project",
    "main": "index.js",
    "scripts": {
        "ci:build": "npm ci",
        "test": "testcafe",
        "precise-commits": "precise-commits"
    },
    "repository": {
        "type": "git",
        "url": "http://github.com/dev/test/testcafe-test"
    },
    "author": "Tom",
    "license": "ISC",
    "devDependencies": {
        "precise-commits": "^1.0.2",
        "prettier": "^1.16.4",
        "random-words": "^1.1.0",
        "testcafe": "^1.8.0"
    },
    "dependencies": {
        "page-objects": "1.6.169"
    }
}

我需要将页面对象版本从 1.6.169 更新到 1.6.170 以及当我们对页面对象版本更改进行更改时 这是我写的bash文件

#!/bin/bash
PROJECT=${1?Error: No test project directory passed}
NEW_VERSION=${2?Error: Pass new version}
echo "Updating page object version for ${PROJECT} project"

cd ~/git/master/test/${PROJECT}
CURRENT_VERSION=$(node -p "require('./package.json').version")  # here it gives me the 
# version of json which is 1.0.0 but i need 1.6.169
sed -i '' "s/${CURRENT_VERSION}/${NEW_VERSION}/" package.json
echo $CURRENT_VERSION
#npm i

如何获得 1.6.69?

Sed 是一种用于过滤和转换文本的高效流编辑器。与其他编辑器不同,它具有在管道中过滤文本的强大功能。不过,考虑到你的package.json内容,还是使用轻量灵活的command-lineJSON处理器更为可取。例如,您可以使用 jq 和如下所示的临时文件来获得 in-place 替换编辑效果。它就像 JSON 数据的 sed - 你可以用它来切片、过滤、映射和转换结构化数据,就像 sed、awk、grep 和朋友让你玩文本一样容易。

tmp=$(mktemp)
jq '.dependencies."page-objects"="1.6.170"' package.json > "$tmp" && mv "$tmp" package.json

如果您想避免使用 hard-coded 版本,请通过 jq 参数传递正确的版本:

version="1.6.172"
tmp=$(mktemp)
jq --arg version "$version" '.dependencies."page-objects"=$version' package.json > "$tmp" && mv "$tmp" package.json

jq 是用 C 编写的,没有运行时依赖性,因此应该可以为几乎任何平台构建它。预构建的二进制文件可用于 Linux、OS X 和 Windows。您可以查看有关 jq here if you're interested. If jq is not installed on your machine, you can easily grab it from here.

的更多详细信息

sed 非常适合编辑文本,但不适合编辑 JSON。您可以试试

要将 "1.6.169" 更改为 "1.6.170":

xidel -s package.json -e '($json).dependencies.page-objects:="1.6.170"'

在您的 bash-script 中,您可以使用...

#!/bin/bash
PROJECT=${1?Error: No test project directory passed}
NEW_VERSION=${2?Error: Pass new version}
echo "Updating page object version for ${PROJECT} project"

cd ~/git/master/test/${PROJECT}
xidel -s package.json --in-place -e '($json).dependencies.page-objects:="'$NEW_VERSION'"'
#npm i

...更新 page-objects 版本并覆盖 'package.json'.

(grep -o '"page-objects": "[^"]' package.json | grep -o '[^"]$' ) 为我工作。 感谢帮助

我遇到了类似的问题,我必须为我维护的库更新 package.json 的版本。我做的和你做的类似

#!/bin/bash
NEW_VERSION=${1?Error: Pass new version}
CURRENT_VERSION=$(node -p "require('./package.json').version") 


sed -i '' "s/${CURRENT_VERSION}/${NEW_VERSION}/" package.json
cat package.json