Bonjour,
je n'ai pas trouvé de topic dédié à Grunt, j'espère donc ne pas m'être trompé d'endroit.
La problématique est la suivante.
Je possède deux sites (disons site_1 et site_2); chacun d'entre eux utilise Grunt et possèdent donc leurs propres Gruntfile.js et package.json.
Si on s'arrêtait là ce serait ok, mais le problème est du coup la duplication du répertoire nodes_modules. Cela devient assez vite lourd.
L'idée étant donc de générer un même nodes_modules / package.json / Gruntfile.js pour l'ensemble des deux sites (respectivement N sites).
Mais quelques problèmes se posent de mon point de vue:
- 1er problème, site_1 et site_2 génèrent les même devDependencies (prenons uglify par exemple). Toutefois, la version n'est pas forcément la même entre les deux.
Par conséquent, ma question est: Est-ce que l'utilisation de versions plus récentes pour certains modules peut engendrer des problèmes ? Auquel cas, quels sont-ils ? Ou bien un upgrade de la version passera systématiquement bien ?
- 2ème problème: Si la partie devDependencies peut être commune, ce n'est pas le cas pour les champs name, version, description,main et scripts qui auront tendance à être plutôt spécifique à chaque site. Ce point-là vous paraît il bloquant ? Pour le moment je ne vois pas comment faire ce pont-là.
Pour résumer: Est-il possible de fusionner ces deux fichiers package.json en un seul:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 { "name": "site_test_1", "version": "1.0.0", "description": "description site 1", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "devDependencies": { "grunt": "^1.0.3", "grunt-contrib-clean": "^1.1.0", "grunt-contrib-cssmin": "^2.2.1", "grunt-contrib-sass": "^1.0.0", "grunt-contrib-uglify": "^3.3.0", "grunt-contrib-watch": "^1.1.0", "grunt-svgmin": "^5.0.0", "load-grunt-tasks": "^4.0.0" } }Troisième problème: Au niveau du Gruntfile.js.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 { "name": "site_test_2", "version": "1.0.0", "description": "description site 2", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "devDependencies": { "grunt": "^1.0.3", "grunt-contrib-clean": "^1.1.0", "grunt-contrib-cssmin": "^2.2.1", "grunt-contrib-sass": "^1.0.0", "grunt-contrib-uglify": "^3.3.0", "grunt-contrib-watch": "^1.1.0", "grunt-svgmin": "^5.0.0", "load-grunt-tasks": "^4.0.0" } }
Voici à quoi ressemblerait le fichier de chacun des deux sites
Maintenant si je rentre dans la configuration ou je veux n'avoir plus qu'un Gruntfile.js pour tous les sites, je dois d'une façon ou d'une autre exprimer les nouveaux chemins.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), //Lancer la commande "grunt uglify" pour minifier les fichiers js des répertoires /assets et /lib uglify:{ options: { preserveComments: false }, frontend: { files: [{ expand: true, cwd: 'assets/js/frontend/', src: [ '*.js' ], dest: 'assets/js/frontend/', ext: '.min.js' }] } } }); grunt.registerTask('default', ['uglify']); };
La solution évidente qui m’apparaît est la suivante ou il suffirait de lister pour chaque site les règles
Le problème, c'est que là aussi, ça va devenir très rapidement indigeste et difficile à maintenant comme fichier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), //Lancer la commande "grunt uglify" pour minifier les fichiers js des répertoires /assets et /lib uglify:{ options: { preserveComments: false }, frontend_site_1: { files: [{ expand: true, cwd: 'site_1/assets/js/frontend/', src: [ '*.js' ], dest: 'site_1/assets/js/frontend/', ext: '.min.js' }] }, frontend_site_2: { files: [{ expand: true, cwd: 'site_2/assets/js/frontend/', src: [ '*.js' ], dest: 'site_2/assets/js/frontend/', ext: '.min.js' }] } } }); grunt.registerTask('default', ['uglify']); };
Je me demande donc s'il est possible de générer dynamiquement le contenu de ce fichier en fonction d'un tableau contenant une liste de site qui construirait le json que l'on passerait par la suite en argument au grunt.initConfig.
J'ai quelque doute car j'ai peur que si je construit le paramètre de initConfig comme un string alors les fonctions comme celle-ci pourrait se retrouver non interprété.Je suis preneur de tout avis sur ces questions. Pour le moment c'est plus de la réflexion qu'autre chose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part pkg: grunt.file.readJSON('package.json'),
Merci d'avance.
Partager