build - significado - Múltiples comandos/tareas con código de Visual Studio
lista de codigos visual basic (4)
Tengo una carpeta local que uso como un bloc de notas para varias muestras pequeñas y piezas de juguete. Almaceno una gran cantidad de Python, C ++, shell scripts, etc. en este directorio.
Estoy usando Visual Studio Code (en OS X) y estoy investigando sus tareas para ejecutar / compilar los fragmentos de código sin tener que cambiar a un terminal.
Por ejemplo, encontré que esta tarea siguiente ejecutará python en el archivo abierto actualmente.
// A task runner that runs a python program
{
"version": "0.1.0",
"command": "/usr/bin/python",
"args": ["${file}"]
}
Esta tarea utilizará python como el ejecutor de tareas independientemente del tipo de archivo que esté editando actualmente.
¿Cómo implemento una tarea para ejecutar un comando basado en el tipo de archivo (o seleccionar entre varios comandos)? Es decir, si estoy editando un archivo C ++, ejecutará clang ++.
- Si no puedo hacerlo basado en el tipo de archivo; ¿Hay alguna alternativa a esto?
- Una alternativa sería; ¿Se admiten varios comandos?
Hice este guión. Requieren instalar IDLE de python en su entorno. Esto abrirá el IDLE y ejecutará su archivo python cada vez que ejecute su tarea (CTRL + Shift + B).
{
"version": "0.1.0",
"command": "/usr/bin/idle",
"isShellCommand": false,
"showOutput": "never",
"args": ["-r","${file}"]
}
Podrías ejecutar un archivo de script auto escrito en lugar de python
. En el archivo de script, extrae la extensión del archivo para llamar a python
, clang
o whatever
.
Así que tu archivo de tareas se vería así
// A task runner that runs a program
{
"version": "0.1.0",
"command": "${workspaceRoot}//runProgram.sh"
"args": ["${file}"]
}
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á pasando aquí:
- Usando bash
-c
para todas las tareas,args
en la listaargs
del comando para que podamos ejecutar comandos arbitrarios. Las declaraciones deecho
son solo ejemplos, pero podrían ser cualquier cosa ejecutable desde su terminal bash. - La matriz
args
contendrá una única cadena que se pasará abash -c
(los elementos separados se tratarían como múltiples argumentos al comando bash y no al comando asociado con-c
arg). -
suppressTaskName
se usa para mantener eltaskName
fuera de la mezcla - El segundo comando muestra cómo puede cargar su
~/.bash_profile
si necesita algo que le proporcione, como alias, variables env, lo que sea - El tercer comando muestra cómo puedes usar el comando de Python que mencionaste
Esto no le proporcionará ningún tipo de detección de extensión de archivo, pero al menos puede usar cmd + p y luego escribir "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 + shift + b o cmd + shift + t respectivamente.
Esta respuesta tiene información útil que también podría ser útil para usted.
Esta respuesta originalmente estaba dirigida a una solución más compleja, pero el formato de tarea simple de shell shell que se presenta en la respuesta aceptada resultó más útil. Vea a continuación lo que parece ahora.
La limitación aquí es que el Código VS está limitado a una sola tarea / comando de compilación de alto nivel para un espacio de trabajo determinado. Se permiten varias tareas secundarias, pero se limitan a usar el "comando" de nivel superior, pero pueden proporcionar "argumentos" diferentes. 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 teniendo en cuenta los argumentos en task.json.
-- the shell file would be a simple "$@" # run what I get -- the tasks.json "args": ["clang++", "-std=c++14", "-O2", "${file}"]
Conseguir el exectuable para ejecutar (
./a.out
) fue más esfuerzo. Simplemente agregándolo como un argumento no funcionó, el script de shell tenía que ejecutarlo si estaba allí.Desactive la conmutación y la ejecución de la salida a un script personalizado, dada la extensión del archivo 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 "$@" 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 ser fácilmente portada a Linux y Windows según sea necesario. Estaré atento a esto e intentaré hacer 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.
Mis tareas.json es compatible con algunos corredores, y un valor predeterminado para la compilación que imprime el mensaje como recordatorio. Utiliza el shell como el 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"
]
}
]
}