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"
  }
}
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"
  }
}
Troisième problème: Au niveau du Gruntfile.js.
Voici à quoi ressemblerait le fichier de chacun des deux sites

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']);
};
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.
La solution évidente qui m’apparaît est la suivante ou il suffirait de lister pour chaque site les règles

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']);
};
Le problème, c'est que là aussi, ça va devenir très rapidement indigeste et difficile à maintenant comme fichier.

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é.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
pkg: grunt.file.readJSON('package.json'),
Je suis preneur de tout avis sur ces questions. Pour le moment c'est plus de la réflexion qu'autre chose.

Merci d'avance.