【问题标题】:I am trying to write a bash script to update package.json dependency version我正在尝试编写一个 bash 脚本来更新 package.json 依赖版本
【发布时间】:2021-02-06 04:34:02
【问题描述】:

这是我的 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?

【问题讨论】:

  • 提示:使用ShellCheck。它不能解决这个问题,但可以帮助您避免脚本中的许多潜在错误。

标签: json bash shell automation


【解决方案1】:

我遇到了类似的问题,我必须为我维护的库更新 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

【讨论】:

  • @ Zeljko Marinkovic,这帮助了我解决我的问题,但这也替换了 package.json 中依赖项中的所有出现,你能帮我只更改 package.json 中的版本吗
  • 如果你从不更新版本字段并使用默认的0.0.1,你可以像我一样做。我正在使用这样的东西来更改版本:sed -i '/"version": *"0.0.1"/ s/"0.0.1"/"'$NEW_VERSION_WITHOUT_V'"/' package.json
【解决方案2】:

Sed 是一个用于过滤和转换文本的高效流编辑器。与其他编辑器不同,它具有强大的过滤管道中文本的能力。但是,考虑到 package.json 的内容,最好使用轻量级且灵活的命令行 JSON 处理器。例如,您可以将jq 与如下所示的临时文件一起使用,以获得就地替换编辑效果。它就像 JSON 数据的 sed - 您可以使用它来切片、过滤、映射和转换结构化数据,就像 sed、awk、grep 和朋友让您玩文本一样容易。

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

如果您想避免硬编码版本,请通过 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 的更多详细信息。如果你的机器上没有安装jq,你可以从here轻松获取。

【讨论】:

  • jq 具有拆分和内置算法来增加补丁版本。
【解决方案3】:

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

"1.6.169" 更改为"1.6.170"

xidel -s package.json -e '($json).dependencies.page-objects:="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}
xidel -s package.json --in-place -e '($json).dependencies.page-objects:="'$NEW_VERSION'"'
#npm i

...更新页面对象版本并覆盖'package.json'

【讨论】:

  • 谢谢。但它的标准输出结果而不是更新到位。
  • @notfluffy 使用--in-place,如第二个代码块所示,我将更新您的“package.json”。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2012-05-15
    • 2015-01-20
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    相关资源
    最近更新 更多