Solución:
Siempre puede usar bash como su corredor de tareas y luego asignar comandos de terminal arbitrarios como sus tareas.
{
"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}"]
}
]
}
Algunas notas sobre lo que está sucediendo aquí:
- Usando bash
-c
para todas las tareas poniéndolo enargs
lista del comando para que podamos ejecutar comandos arbitrarios. losecho
Las declaraciones son solo ejemplos, pero podrían ser cualquier cosa ejecutable desde su terminal bash. - los
args
La matriz contendrá una sola cadena que se pasará abash -c
(los elementos separados se tratarían como argumentos múltiples para el comando bash y no como el comando asociado con el-c
arg). -
suppressTaskName
se utiliza para mantener eltaskName
fuera de la mezcla - El segundo comando muestra cómo puede cargar su
~/.bash_profile
si necesita algo de lo que proporciona, como alias, variables env, lo que sea - El tercer comando muestra cómo podría usar el comando de Python que mencionó
Esto no le dará ningún tipo de detección de extensión de archivo, pero al menos puede usar cmd+pag luego escriba “tarea” para obtener una lista de sus tareas. Siempre puede marcar sus 2 comandos más comunes con isBuildCommand
y isTestCommand
para ejecutarlos a través de cmd+cambio+B o cmd+cambio+t respectivamente.
Esta respuesta tiene información útil que también podría serle útil.
Cambios recientes en el tasks.json
parece haber puesto a disposición un comando para cada una de las tareas enumeradas. Consulte https://code.visualstudio.com/docs/editor/tasks, lo que hace que esto sea discutible.
Esta respuesta originalmente tenía como objetivo una solución más compleja, pero el formato de tarea de ejecución de shell simple como se presenta en la respuesta aceptada resultó más útil. Vea a continuación cómo se ve ahora.
La limitación aquí es que VS Code se limita a una única tarea / comando de compilación de alto nivel para un espacio de trabajo determinado. Se permiten múltiples subtareas, pero están limitadas a usar el “comando” de nivel superior, pero pueden proporcionar diferentes “argumentos”. Esto sería adecuado para un entorno que usa un sistema de compilación similar a make, ant o msbuild. P.ej;
{
"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"
// ...
}
]
}
Hay dos alternativas disponibles;
-
Haga que un script personalizado intente ejecutar la compilación / ejecución únicamente dados los argumentos en task.json.
-- the shell file would be a simple "[email protected]" # run what I get -- the tasks.json "args": ["clang++", "-std=c++14", "-O2", "${file}"]
Conseguir que el ejecutable se ejecute (./a.out
) fue más esfuerzo. Simplemente agregarlo como un argumento no funcionó, se requirió el script de shell para ejecutarlo si estaba allí.
-
Realice el cambio y la ejecución de la salida a un script personalizado, dada la extensión y el nombre del archivo. Esto resultó más fácil de implementar y ofreció más control en el script de shell.
{ "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 }
Y el script de shell, compileme.sh;
#!/bin/sh
# basic error checking not shown...
echo "compilation being executed with the arguments;"
echo "[email protected]"
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
Dadas las opciones enumeradas anteriormente, la segunda opción es preferible. Esta implementación funciona en OS X, pero podría trasladarse fácilmente a Linux y Windows según sea necesario. Estaré atento a esto e intentaré realizar un seguimiento de los cambios en las tareas de compilación de VS Code, las compilaciones basadas en archivos o el soporte para múltiples comandos podrían ser una adición bienvenida.
My tasks.json admite algunos corredores y un valor predeterminado para la compilación que imprime el mensaje como recordatorio. Utiliza el caparazón como corredor y ahora parece …
{
"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"
]
}
]
}
Puede utilizar tareas compuestas para ejecutar varios comandos https://code.visualstudio.com/docs/editor/tasks#_compound-tasks