para - javascript descargar
Usar variable global para establecer la ruta de salida de compilaciĆ³n en Grunt (3)
Entonces, estaba en el camino correcto. El problema es que el módulo se exporta antes de que se establezcan esas variables globales, por lo que no están definidas en tareas posteriores definidas dentro de la tarea initConfig ().
La solución que se me ocurrió, aunque, puede ser mejor, es sobrescribir un valor de grunt.option.
Tengo una opción opcional para mi tarea: objetivo
la solución de trabajo se ve así:
grunt.registerTask("setOutput", "Set the output folder for the build.", function () {
if (global.buildType === "tfs") {
global.outputPath = MACHINE_PATH;
}
if (global.buildType === "local") {
global.outputPath = LOCAL_PATH;
}
if (global.buildType === "release") {
global.outputPath = RELEASE_PATH;
}
if (grunt.option("target")) {
global.outputPath = grunt.option("target");
}
grunt.option("target", global.outputPath);
grunt.log.writeln("Output path: " + grunt.option("target"));
});
Y la tarea definida en initConfig () se veía así:
clean: {
build: {
src: ["<%= grunt.option(/"target/") %>"]
}
}
No dude en entrar si tiene una mejor solución. De lo contrario, quizás esto pueda ayudar a alguien más.
Tengo un par de tareas grupales y estoy tratando de compartir variables globales en esas tareas y me estoy encontrando con problemas.
He escrito algunas tareas personalizadas que establecen la ruta de salida adecuada en función del tipo de compilación. Esto parece estar configurando las cosas correctamente.
// Set Mode (local or build)
grunt.registerTask("setBuildType", "Set the build type. Either build or local", function (val) {
// grunt.log.writeln(val + " :setBuildType val");
global.buildType = val;
});
// SetOutput location
grunt.registerTask("setOutput", "Set the output folder for the build.", function () {
if (global.buildType === "tfs") {
global.outputPath = MACHINE_PATH;
}
if (global.buildType === "local") {
global.outputPath = LOCAL_PATH;
}
if (global.buildType === "release") {
global.outputPath = RELEASE_PATH;
}
if (grunt.option("target")) {
global.outputPath = grunt.option("target");
}
grunt.log.writeln("Output folder: " + global.outputPath);
});
grunt.registerTask("globalReadout", function () {
grunt.log.writeln(global.outputPath);
});
Entonces, estoy tratando de hacer referencia a global.outputPath en una tarea posterior y ejecutar errores.
Si llamo a grunt test
desde la línea de comando, genera la ruta correcta, no hay problema.
Sin embargo, si tengo una tarea como esta: clean: {release: {src: global.outputPath}}
Lanza el siguiente error: Warning: Cannot call method ''indexOf'' of undefined Use --force to continue.
Además, mis constantes en la tarea setOutput se establecen en la parte superior de mi Gruntfile.js
¿Alguna idea? ¿Estoy haciendo algo mal aquí?
Tengo una forma de hacer esto que te permite especificar la ruta de salida utilizando valores como --dev
. Hasta ahora está funcionando muy bien, me gusta bastante. Pensé que lo compartiría, como a alguien más le gustaría, también.
# Enum for target switching behavior
TARGETS =
dev: ''dev''
dist: ''dist''
# Configurable paths and globs
buildConfig =
dist: "dist"
dev: ''.devServer''
timestamp: grunt.template.today(''mm-dd_HHMM'')
grunt.initConfig
cfg: buildConfig
cssmin:
crunch:
options: report: ''min''
files: "<%= grunt.option(''target'') %>/all-min.css": "/**/*.css"
# Set the output path for built files.
# Most tasks will key off this so it is a prerequisite
setPath = ->
if grunt.option ''dev''
grunt.option ''target'', buildConfig.dev
else if grunt.option ''dist''
grunt.option ''target'', "#{buildConfig.dist}/#{buildConfig.timestamp}"
else # Default path
grunt.option ''target'', buildConfig.dev
grunt.log.writeln "Output path set to: `#{grunt.option ''target''}`"
grunt.log.writeln "Possible targets:"
grunt.log.writeln target for target of TARGETS
setPath()
Con esta configuración, puede ejecutar comandos como:
grunt cssmin --dist #sent to dist target
grunt cssmin --dev #sent to dev target
grunt cssmin --dev #sent to default target (dev)
Esta es una pregunta anterior, solo pensé en arrojar mis 5 centavos.
Si necesita que la variable de configuración sea accesible desde cualquier tarea, simplemente defínala en su archivo de configuración principal (el que siempre cargará) de esta manera:
module.exports = function(grunt)
{
//
// Common project configuration
//
var config =
{
pkg: grunt.file.readJSON(''package.json''),
options: // for ''project''
{
dist:
{
outputPath: ''<%= process.cwd() %>/lib'',
},
dev:
{
outputPath: ''<%= process.cwd() %>/build'',
},
},
}
grunt.config.merge( config )
}
Entonces puedes simplemente acceder a un valor como este:
- en archivo (s) de configuración
... my_thingie: [ ends_up_here: ''<%= options.dev.outputPath %>/bundle'', ], ...
- en tareas
// as raw value grunt.config.data.options.dist.outputPath // after (eventual) templates have been processed grunt.config(''options.dist.outputPath'')
Utilicé las options
clave aquí solo para estar en línea con la convención, pero puede usar cualquier cosa siempre que recuerde no registrar una tarea llamada ''options''
o lo que sea que haya usado para la tecla :)