複数の小さなサンプルやおもちゃのコードのスクラッチパッドとして使用するローカルフォルダーがあります。 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 ++が実行されます。
タスクランナーとしていつでも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}"]
}
]
}
ここで何が起こっているかについてのいくつかのメモ:
-c
を使用して、コマンドのargs
リストに配置し、任意のコマンドを実行できるようにします。 echo
ステートメントは単なる例ですが、bashターミナルから実行可能なものであれば何でもかまいません。args
配列には、bash -c
に渡される単一の文字列が含まれます(個別の項目は、-c
argに関連付けられたコマンドではなく、bashコマンドの複数の引数として扱われます)。suppressTaskName
は、taskName
をミックスから除外するために使用されています~/.bash_profile
をロードする方法を示していますこれにより、ファイル拡張子の検出は行われませんが、少なくとも使用できます cmd+p 次に「task」と入力して、タスクのリストを取得します。 2つの最も一般的なコマンドをisBuildCommand
とisTestCommand
でいつでもマークして、それらを実行することができます cmd+shift+b または cmd+shift+t それぞれ。
この回答 にも役立つ情報があります。
この回答はもともとより複雑なソリューションを目的としていましたが、受け入れられた回答に示されている単純なシェルランナータスク形式がより有用であることが判明しました。以下のようになります。
ここでの制限は、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"
]
}
]
}