2014-04-10 14 views
11

Come accedere alla proprietà di configurazione Grunt site per leggere il file project.json nel percorso specificato dal valore della proprietà config?Accesso ai dati di configurazione Grunt all'interno di initConfig()

grunt.registerTask('build', function(target) { 
    grunt.config('site', target); 
    grunt.task.run('foo:dist', 'bar:dist'); 
}); 

grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    site: grunt.file.readJSON('./sites/' + grunt.config('site') + '/project.json') 
}); 

grugnito-cli:

grunt build:sitename 

>> Error: Unable to read "./sites/undefined/project.json" 

Utilizzando un example dalla documentazione, ho anche provato questo:

grunt.registerTask('global', 'site', function(prop, value) { 
    global[prop] = val; 
}); 

grunt.registerTask('build', ['foo:dist', 'bar:dist']); 

grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    site: grunt.file.readJSON('./sites/' + global.site + '/project.json') 
}); 

grugnito-cli:

grunt global:site:sitename 

>> Error: Unable to read "./sites/undefined/project.json" 

Aggiornamento:

Utilizzando la risposta @FelixKling come guida, ho fatto qualche progresso:

grunt.registerTask('build', function(target) { 
    grunt.config.set('target', target); 
    grunt.config.set('site', grunt.file.readJSON('./sites/' + grunt.config.get('target') + '/project.json')); 
    grunt.task.run('watch'); 
}); 

grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    site: grunt.config.get('site'), 

    watch: { 
    sass: { 
     files: ['<%= site.dev %>/scss/*.scss'], 
     tasks: ['sass:dist'] 
    } 
    }, 

    sass: { 
    dist: { 
     files: { 
     '<%= site.dist %>/style.css': '<%= site.dev %>/scss/style.scss' 
     } 
    } 
    }, 
}); 

Ora io sono in grado di leggere nella project.json file con successo, e (in qualche modo) è anche in grado di riconoscere quando vengono apportate modifiche ai file guardati. Ma per qualche ragione quando si esegue l'attività sass:dist, ottengo questo errore: Warning: An error occurred while processing a template (Cannot read property 'dev' of undefined).

Io non sono chiare su come il compito watch è in grado di ottenere il valore corretto per site, ma ancora più importante, ho bisogno di capire un modo per ottenere lo stesso valore per l'attività sass.

+0

Per quanto riguarda l'aggiornamento, al momento 'grunt.file.readJSON ('./ siti /' + globali. site + '/project.json') 'corre,' global.site' non esiste ancora poiché il task 'global' non è ancora stato eseguito. Controlla di nuovo la mia risposta, ho risolto ciò che era sbagliato. –

risposta

17

initConfig e grunt.file.readJSON corrono prima dell'esecuzione dell'attività. Sembra che ciò di cui hai bisogno sono le stringhe di modello e puoi chiamare solo grunt.file.readJSON quando hai effettivamente il nome di destinazione.

Ad esempio:

grunt.registerTask('build', function(target) { 
    grunt.config.set('target', target); 
    grunt.config.set('site', grunt.file.readJSON(grunt.config.get('path')); 
    grunt.task.run('foo:dist', 'bar:dist'); 
}); 

grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    path: './sites/<%= target %>/project.json' 
}); 

Maggiori informazioni: http://gruntjs.com/api/grunt.config


Per quanto riguarda l'aggiornamento: Si sono fondamentalmente facendo di nuovo lo stesso errore come avete fatto nel vostro primo esempio. Stai tentando di accedere alla configurazione site prima che fosse impostata.

Dovete capire che la fase di inizializzazione, vale a dire grunt.initConfig avviene prima qualsiasi codice relativo compito viene eseguito:

Initialize config -> Run task 

Vediamo grunt.initConfig in isolamento:

grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    site: grunt.config.get('site'), 
}); 

Questa è la fase di inizializzazione, che avviene prima di ogni altra cosa. L'argomento passato a initConfig, l'oggetto di configurazione, viene valutato per primo. Quello che stai cercando di fare qui è accedere alle opzioni di configurazione site, prima ancora che la configurazione fosse stata creata.Spero tu riconosca che questo non ha senso.

Forse ti aiuta a capire il processo se inserisci grunt.initConfig nella parte superiore, prima di registrare qualsiasi attività.


La soluzione:

Penso che quello che in realtà potrebbe essere successiva sono gli argomenti della riga di comando, con il quale è possibile controllare quale sito per costruire. Vedere grunt.option per ulteriori informazioni.

Ad esempio:

grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 

    watch: { 
    sass: { 
     files: ['<%= site.dev %>/scss/*.scss'], 
     tasks: ['sass:dist'] 
    } 
    } 
}); 

grunt.config.set('site', grunt.file.readJSON('./sites/' + grunt.option('site') + '/project.json')); 

e quindi si esegue l'operazione con

grunt watch --site=somesite 
+1

Sicuramente il file inline grunt.file.readJSON() in initConfig verrà _still_ eseguito prima di registerTask. – Rajit

+0

@Rajit: Oops, dimentica di rimuovere quella parte. Grazie! –

+0

Quando eseguo il codice come mostrato, viene visualizzato questo errore: 'Impossibile leggere" ./sites/ <% target %> /project.json "'. C'è un trucco per convincere Grunt a interpolare la variabile durante la lettura del percorso del file? – cantera

Problemi correlati