我正在尝试编写 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。您可以试试 xidel。
要将 "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
这是我的 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。您可以试试 xidel。
要将 "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