1

这是我之前尝试使用 npm 脚本进行设置时遇到的一个问题,但我无法解决它。甚至不确定这是可能的,最好我希望该解决方案在 Mac 和 Windows 环境中都可以工作。

我正在尝试将我的 npm 脚本的一些逻辑拆分为几个可以相互调用的短脚本。这与变量的结合将使脚本更好地为其他开发人员维护和阅读。

但是我不知道如何在另一个中使用一个 npm 脚本的结果。我几乎不是 bash 专家,所以为什么我在这里寻求帮助(:

在这个例子中,我试图设置一个脚本,允许开发人员轻松启动一个 docker(虚拟)环境。

在 package.json 中:

...
"config": {
    "docker": {
        "container": "docker-test"
    }
},
"scripts": {
    "container_run": "docker run -d -p 80:80 $npm_package_config_docker_container"
    "container_running": "docker inspect -f {{.State.Running}} $npm_package_config_docker_container || echo 'false'",
    "container_stop": "docker stop $npm_package_config_docker_container && docker rm $npm_package_config_docker_container",
    "start": "???"
}

所以这里我有一个变量,其中包含要运行的 docker 容器的名称:$npm_package_config_docker_container.

当我这样做npm run container_running时,如果容器正在运行,这将返回 true,或者如果容器不存在则抛出错误,在这种情况下它将返回echo 'false'。到目前为止,一切都很好。

现在我希望启动脚本检查容器是否正在运行,如果是,则停止容器并开始新的运行并且它没有运行只是开始新的运行。所以是这样的:

"start": "if [ container_running == "true" ]; then container_stop && container_run; else container_run; fi"

那么问题是如何实现这一目标?作为一个额外的问题,这可以在 Mac 和 Windows 环境中以兼容的方式完成吗?

任何帮助将非常感激!!

4

2 回答 2

1

老实说,对于任何比带有选项的单个命令更复杂的东西,我创建一个 bin 文件夹并为其添加一个自定义脚本文件,然后让其中一个非脚本调用它。例如:

"container_run": "./bin/container-run"

问题是,您不必成为 bash 专家,因为您可以使用 #! /usr/env 节点在顶部,然后用 JavaScript 编写其余部分。

于 2016-12-20T10:50:05.793 回答
1

经过更多挖掘后,我找到解决他的方法,尽管我确信这可以改进。

您可以使用命令替换来运行$(npm run container_running),这将返回运行该命令的所有输出(在子shell中)。然后您可以测试输出以检查最后一个单词是否为“真”。

"start": "if [[ $(npm run container_running) == *true ]]; then npm run container_stop && npm run container_run; else npm run container_run; fi"

尚未在 Windows 上对此进行测试。

如果有人有更好的想法/解决方案,请告诉我!

于 2016-12-20T10:40:18.247 回答