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

正直なところ、オプション付きの 1 つのコマンドよりも複雑な場合は、bin フォルダーを作成してカスタム スクリプト ファイルを追加し、代わりに非スクリプトの 1 つにそれを呼び出させます。例えば:

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

問題は、#! を使用してそのファイルを作成できるため、bash の専門家である必要はありません。/usr/env ノードを一番上に置き、残りを JavaScript で記述します。

于 2016-12-20T10:50:05.793 に答える
1

もう少し掘り下げた後、私は彼解決策を見つけましたが、これは改善できると確信しています。

コマンド置換を使用して を実行できます$(npm run container_running)。これにより、そのコマンドの実行からのすべての出力が (サブシェルで) 返されます。次に、出力をテストして、最後の単語が「true」であるかどうかを確認できます。

"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 に答える