web-dev-qa-db-ja.com

Visual Studio Codeを使用した複数のコマンド/タスク

複数の小さなサンプルやおもちゃのコードのスクラッチパッドとして使用するローカルフォルダーがあります。 python、C++、シェルスクリプトなどのホストをこのディレクトリに保存します。

私は(OS Xで)Visual Studio Codeを使用しており、 そのタスク を調べて、ターミナルに切り替えることなくコードスニペットを実行/コンパイルしています。

たとえば、 この次のタスク は、現在開いているファイルに対してpythonを実行します。

// A task runner that runs a python program
{
    "version": "0.1.0",
    "command": "/usr/bin/python",
    "args": ["${file}"]
}

このタスクは、現在編集中のファイルのタイプに関係なく、タスクランナーとしてpythonを使用します。

ファイルタイプに基づいてコマンドを実行する(または複数のコマンドから選択する)タスクを実装するにはどうすればよいですか?つまりC++ファイルを編集している場合、clang ++が実行されます。

  • ファイルの種類に基づいてできない場合。これに代わるものはありますか?
  • 代替案は次のとおりです。複数のコマンドがサポートされていますか?
24
Niall

タスクランナーとしていつでもbashを使用し、タスクとして任意の端末コマンドを割り当てることができます。

{
    "version": "0.1.0",
    "command": "bash",
    "isShellCommand": true,
    "showOutput": "always",
    "args": [
        "-c"
    ],
    "tasks": [
        {
            "taskName": "My First Command",
            "suppressTaskName": true,
            "isBuildCommand": true,
            "args": ["echo cmd1"]
        },
        {
            "taskName": "My Command Requiring .bash_profile",
            "suppressTaskName": true,
            "args": ["source ~/.bash_profile && echo cmd2"]
        },
        {
            "taskName": "My Python task",
            "suppressTaskName": true,
            "args": ["/usr/bin/python ${file}"]
        }
    ]
}

ここで何が起こっているかについてのいくつかのメモ:

  • すべてのタスクにbash -cを使用して、コマンドのargsリストに配置し、任意のコマンドを実行できるようにします。 echoステートメントは単なる例ですが、bashターミナルから実行可能なものであれば何でもかまいません。
  • args配列には、bash -cに渡される単一の文字列が含まれます(個別の項目は、-c argに関連付けられたコマンドではなく、bashコマンドの複数の引数として扱われます)。
  • suppressTaskNameは、taskNameをミックスから除外するために使用されています
  • 2番目のコマンドは、エイリアス、環境変数など、提供するものが必要な場合に~/.bash_profileをロードする方法を示しています
  • 3番目のコマンドは、Python

これにより、ファイル拡張子の検出は行われませんが、少なくとも使用できます cmd+p 次に「task」と入力して、タスクのリストを取得します。 2つの最も一般的なコマンドをisBuildCommandisTestCommandでいつでもマークして、それらを実行することができます cmd+shift+b または cmd+shift+t それぞれ。

この回答 にも役立つ情報があります。

33
bingles

この回答はもともとより複雑なソリューションを目的としていましたが、受け入れられた回答に示されている単純なシェルランナータスク形式がより有用であることが判明しました。以下のようになります。


ここでの制限は、VS Codeが特定のワークスペースの単一の高レベルビルドタスク/コマンドに制限されることです。複数のサブタスクを使用できますが、トップレベルの「コマンド」の使用に制限されていますが、異なる「引数」を提供できます。これは、make、ant、msbuildのようなビルドシステムを使用する環境に適しています。例えば。;

{
    "version": "0.1.0",
    "command": "make", // command must appear here
    "tasks" : [
        {
            "taskName": "clean",
            "suppressTaskName": false, // false by default
            //"command": "somethingelse", // not valid here
            "args": ["${file}"] // if required
        },
        {
            "taskName": "install"
            // ...
        }
    ]
}

2つの選択肢があります。

  • Task.jsonの引数のみを指定して、カスタムスクリプトでコンパイル/実行を実行しようとします。

    -- the Shell file would be a simple
    "$@" # run what I get
    -- the tasks.json
    "args": ["clang++", "-std=c++14", "-O2", "${file}"]
    

    実行可能ファイルを実行する(./a.out)さらに努力しました。引数として追加するだけでは機能せず、シェルスクリプトが存在する場合は実行する必要がありました。

  • ファイル拡張子とファイル名を指定して、切り替えとカスタムスクリプトへの出力の実行を行います。これにより、シェルスクリプトでの実装が容易になり、制御が強化されました。

    {
        "version": "0.1.0",
        "isShellCommand": true,
        "taskName": "generic build",
        "showOutput": "always",
        "args": ["${fileExtname}", "${file}"]
        "command": "./.vscode/compileme.sh", // expected in the "local settings" folder
        //"command": "~/compileme.sh", // if in HOME folder
    }
    

    シェルスクリプト、compileme.sh。

    #!/bin/sh
    # basic error checking not shown...
    echo "compilation being executed with the arguments;"
    echo "$@"
    filetype=$1
    file=$2
    if [ $filetype = ".cpp" -o $filetype = ".cxx" ] ; then 
        clang++ -std=c++14 -Wall -Wextra -pedantic -pthread $file && ./a.out
    Elif [ $filetype = ".c" ]
        then 
        clang -std=c11 -Wall -Wextra -pedantic -pthread $file && ./a.out
    Elif [ $filetype = ".sh" ]
        then
        $file
    Elif [ $filetype = ".py" ]
        then
        python $file
    else
        echo "file type not supported..."
        exit 1
    fi
    

上記のオプションがある場合、2番目のオプションの方が適しています。この実装はOS Xで動作しますが、必要に応じてLinuxおよびWindowsに簡単に移植できます。これに注目し、VS Codeビルドタスク、ファイルベースのビルド、または複数のコマンドのサポートに対する変更の追跡を歓迎します。


私のtasks.jsonは、少数のランナーと、リマインダーとしてメッセージを出力するビルドのデフォルトをサポートしています。シェルをランナーとして使用し、次のようになります...

{
    "version": "0.1.0",
    "isShellCommand": true,
    "taskName": "GenericBuild",
    "showOutput": "always",
    "command": "sh",
    "suppressTaskName": false,
    "args": ["-c"],
    "tasks": [
        {
            "taskName": "no build",
            "suppressTaskName": true,
            "isBuildCommand": true,
            "args": [
                "echo There is no default build task, run a task by name..."
            ]
        },
        {
            "taskName": "cpp",
            "suppressTaskName": true,
            "args": [
                "clang++ -std=c++14 -Wall -Wextra -pedantic -pthread \"${file}\" && ./a.out"
            ]
        },
        {
            "taskName": "Shell",
            "suppressTaskName": true,
            "args": [
                "\"${file}\""
            ]
        },
        {
            "taskName": "python",
            "suppressTaskName": true,
            "args": [
                "python \"${file}\""
            ]
        },
        {
            "taskName": "c",
            "suppressTaskName": true,
            "args": [
                "clang -std=c11 -Wall -Wextra -pedantic -pthread \"${file}\" && ./a.out"
            ]
        }
    ]
}
6
Niall