Fedora-Fr - Communauté francophone Fedora - Linux

Planet de Fedora-Fr : la communauté francophone autour de la distribution Linux Fedora

A propos

Cette page est actualisée toutes les heures.

Cette page est une sélection de blogs autour de Fedora. Fedora-Fr.org décline toute responsabilité au sujet des propos tenus par les auteurs des blogs de ce planet. Leurs propos sont leur entière responsabilité.

Le contenu de ce planet appartient à leurs auteurs respectifs. Merci de consulter leur blogs pour obtenir les licences respectives.

Grunt, Bower, LESS & Bootstrap

Guillaume Kulakowski
Dans mon dernier billet, j'avais évoqué mon engouement pour Bower, une solution de gestion de dépendances web. J'avais alors regretté le fait de ne pas pouvoir exécuter des tâches post-installation afin de retravailler la version distribuée de Bootstrap pour lalléger (comme on peut le faire ici). Comme j'en avais émis l'idée dans ce même billet, j'ai entrepris de ne plus utiliser Bower directement mais de lutiliser au travers de Grunt.

grunt-bower.png

Si vous ne connaissez pas encore Grunt, il s'agit d'un ordonnanceur au même titre que Maven, ant, ou encore Phing, mais basé sur nodejs et utilisant une syntaxe JavaScript.

Installation de Bower & Grunt sous Fedora 20

Après avoir installé nodejs et npm via yum, il faudra installer Bower et Grunt avec npm. En effet, Bower est absent des dépôts Fedora et Grunt est bien disponible mais sans grunt-cli, ce qui en enlève tout lintérêt...

sudo yum install npm -y
sudo npm install bower grunt grunt-cli -g

Notez au passage le fait que l'on fasse l'installation avec l'option -g pour avoir Grunt et Bower installés au niveau du système (/usr/lib/node_modules). Les autres installations se feront toujours à l'aide de npm mais sans cette option. Ceci permet de tout avoir à la racine du projet web, dans un répertoire node_modules (qu'il faudra exclure de la gestion de sources).

Voila, maintenant on rajoute un fichier packages.json et on installe les dépendances avec un npm install :

{
  "name": "Boldy",
  "version": "1.1.2",
  "description": "The Boldy theme for Dotclear",
  "repository": {
    "type": "git",
  },
  "author": "Guillaume Kulakowski",
  "homepage": "http://www.llaumgui.com",
  "devDependencies": {
    "bower": "latest",
    "grunt": "~0.4.2",
    "grunt-contrib-uglify": "latest",
    "grunt-contrib-concat": "latest",
    "grunt-contrib-less": "latest",
    "grunt-bower-task": "latest",
    "grunt-contrib-watch": "latest"
    "grunt-contrib-cssmin": "latest"
  }
}

J'ai maintenant un environnement de travail avec Bower et Grunt ainsi que les plugins nécessaires à mon projet.

Le fichier Gruntfile.js

La configuration des tâches Grunt passe par le fichier Gruntfile.js, j'ai mis le mien et vais en détailler les tâches :

module.exports = function(grunt) {
  'use strict';
 
  // Force use of Unix newlines
  grunt.util.linefeed = '\n';
 
  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    bowerrc: grunt.file.readJSON('.bowerrc'),
 
    // Path configuration from Gruntfile.js
    dirs: {
      'vendor': '<%= bowerrc.directory %>',
      'bootstrap': {
        'js': '<%= dirs.vendor %>/bootstrap/js',
        'less': '<%= dirs.vendor %>/bootstrap/less'
      },
      'css': 'css',
      'less': 'less',
      'js': 'js'
    },
 
    src: {
      output: {
        'bootstrap': {
          'js': '<%= dirs.vendor %>/bootstrap/my/js/bootstrap.js',
          'css': '<%= dirs.vendor %>/bootstrap/my/css/bootstrap.css'
        },
        'boldy': {
          css: {
            'screen': '<%= dirs.css %>/screen.css',
            'indefero': '<%= dirs.css %>/indefero.css'
          },
          js: '<%= dirs.js %>/global.js'
        }
      },
 
      input: {
        bootstrap: {
          'js': [
            '<%= dirs.bootstrap.js %>/dropdown.js',
            '<%= dirs.bootstrap.js %>/tooltip.js',
            '<%= dirs.bootstrap.js %>/collapse.js',
            '<%= dirs.bootstrap.js %>/transition.js',
            '<%= dirs.bootstrap.js %>/carousel.js'
          ],
          'less': [
            '<%= dirs.less %>/bootstrap.less'
          ]
        },
        indefero: '<%= dirs.css %>/indefero.src.css',
        less: '<%= dirs.less %>/boldy_boot.less',
        js: [
          '<%= dirs.vendor %>/jquery-cookie/jquery.cookie.js',
          '<%= src.output.bootstrap.js %>',
          '<%= dirs.vendor %>/scroll-to-top/jquery.scrollToTop.min.js',
          '<%= dirs.js %>/js/post.js',
          '<%= dirs.vendor %>/async-gravatars/async-gravatars.js',
          '<%= dirs.vendor %>/jquery-colorbox/jquery.colorbox-min.js',
          '<%= dirs.vendor %>/nwxforms/src/nwxforms.js',
          '<%= dirs.js %>/boldy.js'
        ]
      },
    },
 
    // Banner
    banner: '/*!\n' +
              ' * Boldy for Dotclear v<%= pkg.version %>\n' +
              ' * Original theme by Site5 (http://www.s5themes.com)\n' +
              ' * Under a GPLv2 http://www.gnu.org/licenses/gpl-2.0.txt\n' +
              ' * Ported on Dotclear by <%= pkg.author %> (<%= pkg.homepage %>)\n' +
              ' * Copyright 2012-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
              ' */',
 
 
 
    /********************************** Task **********************************/
    // Bower
    bower: {
      install: {
        options: {
          targetDir: '<%= dirs.vendor %>',
          cleanTargetDir: true,
          layout: 'byComponent',
          install: true,
          copy: false,
          verbose: true
        }
      }
    },
 
 
    // Concatenation
    concat: {
      bootstrap: {
        src: '<%= src.input.bootstrap.js %>',
        dest: '<%= src.output.bootstrap.js %>'
      },
    },
 
 
    // LESS
    less: {
      boldy: {
        options: {
          compress: true,
          cleancss: true,
          report: 'gzip',
          strictImports: true,
        },
        files: { '<%= src.output.boldy.css.screen %>': '<%= src.input.less %>'},
      },
      boldy_debug: {
          options: {
            compress: false,
            cleancss: false,
            report: 'none',
            strictImports: true,
          },
          files: { '<%= src.output.boldy.css.screen %>': '<%= src.input.less %>'},
      },
      bootstrap: {
        files: { '<%= src.output.bootstrap.css %>': '<%= src.input.bootstrap.less %>'}
      }
    },
 
 
    // Watcher
    watch: {
      boldy: {
        files: ['less/*.less'],
        tasks: ['less:boldy_debug'],
        options: {
          spawn: false,
        },
      },
    },
 
 
    // CSSmin
    cssmin: {
      boldy: {
        options: {
          report: 'gzip',
          banner: '<%= banner %>'
        },
        files: {
          '<%= src.output.boldy.css.indefero %>': '<%= src.input.indefero %>'
        }
      }
    },
 
 
    // Uglify
    uglify: {
      boldy: {
        options: {
          report: 'gzip',
          banner: '<%= banner %>'
        },
        files: {
          '<%= src.output.boldy.js %>': '<%= src.input.js %>',
        }
      }
    }
 
  });
 
 
  // Load plugins
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-contrib-less');
  grunt.loadNpmTasks('grunt-bower-task');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-cssmin');
 
 
  // Callable tasks
  grunt.registerTask('default', ['boldy', 'cssmin', 'concat:bootstrap', 'uglify']);
  grunt.registerTask('w', ['watch:boldy']);
 
  grunt.registerTask('bootstrap', ['concat:bootstrap', 'less:bootstrap']);
  grunt.registerTask('boldy', ['less:boldy']);
 
  grunt.registerTask('full', ['bower', 'bootstrap', 'default']);
  grunt.registerTask('all', ['full']); // Alias
};

Tâche bower

Via le plugin grunt-bower-task.

Cette tâche est là pour exécuter Bower au travers de Grunt, notez que le plugin n'interprète pas le .bowerrc, je l'ai donc chargé moi même (bowerrc: grunt.file.readJSON('.bowerrc')) afin de passer les mêmes options à la tâche Grunt qu'à Bower.

Tâche Bootstrap

Via les plugins grunt-contrib-less & grunt-contrib-concat.

Le but de cette tâche est de ne pas utiliser la version distribuée de Bootstrap mais de reconstruire ma propre version. Pour celà,

  • je reconstruis le JavaScript à partir des sources et du plugin concat,
  • je recompile les CSS à partir d'une version allégée du bootstrap.less :
/* -- BEGIN LICENSE BLOCK ---------------------------------------
# This file is part of Boldy, a theme for Dotclear
#
# Theme by Site5 (http://www.s5themes.com)
# under a GPLv2 http://www.gnu.org/licenses/gpl-2.0.txt
# Ported on Dotclear by Guillaume Kulakowski (http://www.llaumgui.com)
#
# -- END LICENSE BLOCK ----------------------------------------- */
 
// Core variables and mixins
@import "../vendor/bootstrap/less/variables.less";
@import "../vendor/bootstrap/less/mixins.less";
 
// My override
@import "bootstrap_variables.less";
//@import "bootstrap_mixins.less";
 
// Reset
@import "../vendor/bootstrap/less/normalize.less";
@import "../vendor/bootstrap/less/print.less";
 
// Core CSS
@import "../vendor/bootstrap/less/scaffolding.less";
@import "../vendor/bootstrap/less/type.less";
@import "../vendor/bootstrap/less/code.less";
@import "../vendor/bootstrap/less/grid.less";
//@import "../vendor/bootstrap/less/tables.less";
@import "../vendor/bootstrap/less/forms.less";
@import "../vendor/bootstrap/less/buttons.less";
 
// Components
@import "../vendor/bootstrap/less/component-animations.less";
//@import "../vendor/bootstrap/less/glyphicons.less";
@import "../vendor/bootstrap/less/dropdowns.less";
//@import "../vendor/bootstrap/less/button-groups.less";
//@import "../vendor/bootstrap/less/input-groups.less";
@import "../vendor/bootstrap/less/navs.less";
@import "../vendor/bootstrap/less/navbar.less";
//@import "../vendor/bootstrap/less/breadcrumbs.less";
@import "../vendor/bootstrap/less/pagination.less";
@import "../vendor/bootstrap/less/pager.less";
//@import "../vendor/bootstrap/less/labels.less";
//@import "../vendor/bootstrap/less/badges.less";
//@import "../vendor/bootstrap/less/jumbotron.less";
@import "../vendor/bootstrap/less/thumbnails.less";
@import "../vendor/bootstrap/less/alerts.less";
//@import "../vendor/bootstrap/less/progress-bars.less";
//@import "../vendor/bootstrap/less/media.less";
@import "../vendor/bootstrap/less/list-group.less";
@import "../vendor/bootstrap/less/panels.less";
@import "../vendor/bootstrap/less/wells.less";
//@import "../vendor/bootstrap/less/close.less";
 
// Components w/ JavaScript
//@import "../vendor/bootstrap/less/modals.less";
@import "../vendor/bootstrap/less/tooltip.less";
//@import "../vendor/bootstrap/less/popovers.less";
@import "../vendor/bootstrap/less/carousel.less";
 
// Utility classes
@import "../vendor/bootstrap/less/utilities.less";
@import "../vendor/bootstrap/less/responsive-utilities.less";

Remarquez que j'utilise mes propres variables après celles de Bootstrap afin de les écraser et de modifier Bootstrap directement à la source.

Tâche Boldy

Via les plugins grunt-contrib-uglify, grunt-contrib-less & grunt-contrib-cssmin.

Comme en recompilant Bootstrap à partir des sources LESS j'ai adhéré au concept de LESS, j'ai réécrit le thème de mon blog en LESS.

Cette tâche boldy sert donc :

  • à générer le CSS minifié à partir des sources LESS (grunt-contrib-less),
  • à minifier la CSS pour mon thème indefero qui reste en CSS (grunt-contrib-cssmin),
  • et à minifier les Javascripts (grunt-contrib-uglify).

Tâche watch

Via le plugin grunt-contrib-watch.

Pour compiler du LESS en CSS, il y a 2 méthodes.

  • soit passer par le less.js qui va parser en JS les fichiers LESS à chaque chargement de page (2 à 3 secondes pour mon blog),
  • soit passer par une tâche watch dans Grunt, qui va écouter les modifications sur les fichiers LESS et recompiler un CSS.

C'est cette dernière solution que j'ai retenu et donc c'est à cela que sert la tâche watch.

En conclusion

Pour conclure, je dirais que la mise en place de ces outils (surtout pour la première fois) est certes chronophage, mais une fois que ça tourne, pour mettre à jour les libs (Bootstrap, jQuery, etc.), une seule ligne de commande suffit (grunt full). De plus, une fois Grunt et Bower en place (et maîtrisés), passer de CSS à LESS a été super simple.

Pour finir, je regrette presque que nodejs n'ait pas été inclus dans Fedora plus tôt car il propose de formidables outils indispensables aux développeurs (front) web.

Et pour voir ce que ça donne, une petite vidéo:

Grunt, Bower, LESS & Bootstrap

Guillaume Kulakowski
Dans mon dernier billet, j'avais évoqué mon engouement pour Bower, une solution de gestion de dépendances web. J'avais alors regretté le fait de ne pas pouvoir exécuter des tâches post-installation afin de retravailler la version distribuée de Bootstrap pour lalléger (comme on peut le faire ici). Comme j'en avais émis l'idée dans ce même billet, j'ai entrepris de ne plus utiliser Bower directement mais de lutiliser au travers de Grunt.

grunt-bower.png

Si vous ne connaissez pas encore Grunt, il s'agit d'un ordonnanceur au même titre que Maven, ant, ou encore Phing, mais basé sur nodejs et utilisant une syntaxe JavaScript.

Installation de Bower & Grunt sous Fedora 20

Après avoir installé nodejs et npm via yum, il faudra installer Bower et Grunt avec npm. En effet, Bower est absent des dépôts Fedora et Grunt est bien disponible mais sans grunt-cli, ce qui en enlève tout lintérêt...

sudo yum install npm -y
sudo npm install bower grunt grunt-cli -g

Notez au passage le fait que l'on fasse l'installation avec l'option -g pour avoir Grunt et Bower installés au niveau du système (/usr/lib/node_modules). Les autres installations se feront toujours à l'aide de npm mais sans cette option. Ceci permet de tout avoir à la racine du projet web, dans un répertoire node_modules (qu'il faudra exclure de la gestion de sources).

Voila, maintenant on rajoute un fichier packages.json et on installe les dépendances avec un npm install :

{
  "name": "Boldy",
  "version": "1.1.2",
  "description": "The Boldy theme for Dotclear",
  "repository": {
    "type": "git",
  },
  "author": "Guillaume Kulakowski",
  "homepage": "http://www.llaumgui.com",
  "devDependencies": {
    "bower": "latest",
    "grunt": "~0.4.2",
    "grunt-contrib-uglify": "latest",
    "grunt-contrib-concat": "latest",
    "grunt-contrib-less": "latest",
    "grunt-bower-task": "latest",
    "grunt-contrib-watch": "latest"
    "grunt-contrib-cssmin": "latest"
  }
}

J'ai maintenant un environnement de travail avec Bower et Grunt ainsi que les plugins nécessaires à mon projet.

Le fichier Gruntfile.js

La configuration des tâches Grunt passe par le fichier Gruntfile.js, j'ai mis le mien et vais en détailler les tâches :

module.exports = function(grunt) {
  'use strict';
 
  // Force use of Unix newlines
  grunt.util.linefeed = '\n';
 
  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    bowerrc: grunt.file.readJSON('.bowerrc'),
 
    // Path configuration from Gruntfile.js
    dirs: {
      'vendor': '<%= bowerrc.directory %>',
      'bootstrap': {
        'js': '<%= dirs.vendor %>/bootstrap/js',
        'less': '<%= dirs.vendor %>/bootstrap/less'
      },
      'css': 'css',
      'less': 'less',
      'js': 'js'
    },
 
    src: {
      output: {
        'bootstrap': {
          'js': '<%= dirs.vendor %>/bootstrap/my/js/bootstrap.js',
          'css': '<%= dirs.vendor %>/bootstrap/my/css/bootstrap.css'
        },
        'boldy': {
          css: {
            'screen': '<%= dirs.css %>/screen.css',
            'indefero': '<%= dirs.css %>/indefero.css'
          },
          js: '<%= dirs.js %>/global.js'
        }
      },
 
      input: {
        bootstrap: {
          'js': [
            '<%= dirs.bootstrap.js %>/dropdown.js',
            '<%= dirs.bootstrap.js %>/tooltip.js',
            '<%= dirs.bootstrap.js %>/collapse.js',
            '<%= dirs.bootstrap.js %>/transition.js',
            '<%= dirs.bootstrap.js %>/carousel.js'
          ],
          'less': [
            '<%= dirs.less %>/bootstrap.less'
          ]
        },
        indefero: '<%= dirs.css %>/indefero.src.css',
        less: '<%= dirs.less %>/boldy_boot.less',
        js: [
          '<%= dirs.vendor %>/jquery-cookie/jquery.cookie.js',
          '<%= src.output.bootstrap.js %>',
          '<%= dirs.vendor %>/scroll-to-top/jquery.scrollToTop.min.js',
          '<%= dirs.js %>/js/post.js',
          '<%= dirs.vendor %>/async-gravatars/async-gravatars.js',
          '<%= dirs.vendor %>/jquery-colorbox/jquery.colorbox-min.js',
          '<%= dirs.vendor %>/nwxforms/src/nwxforms.js',
          '<%= dirs.js %>/boldy.js'
        ]
      },
    },
 
    // Banner
    banner: '/*!\n' +
              ' * Boldy for Dotclear v<%= pkg.version %>\n' +
              ' * Original theme by Site5 (http://www.s5themes.com)\n' +
              ' * Under a GPLv2 http://www.gnu.org/licenses/gpl-2.0.txt\n' +
              ' * Ported on Dotclear by <%= pkg.author %> (<%= pkg.homepage %>)\n' +
              ' * Copyright 2012-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
              ' */',
 
 
 
    /********************************** Task **********************************/
    // Bower
    bower: {
      install: {
        options: {
          targetDir: '<%= dirs.vendor %>',
          cleanTargetDir: true,
          layout: 'byComponent',
          install: true,
          copy: false,
          verbose: true
        }
      }
    },
 
 
    // Concatenation
    concat: {
      bootstrap: {
        src: '<%= src.input.bootstrap.js %>',
        dest: '<%= src.output.bootstrap.js %>'
      },
    },
 
 
    // LESS
    less: {
      boldy: {
        options: {
          compress: true,
          cleancss: true,
          report: 'gzip',
          strictImports: true,
        },
        files: { '<%= src.output.boldy.css.screen %>': '<%= src.input.less %>'},
      },
      boldy_debug: {
          options: {
            compress: false,
            cleancss: false,
            report: 'none',
            strictImports: true,
          },
          files: { '<%= src.output.boldy.css.screen %>': '<%= src.input.less %>'},
      },
      bootstrap: {
        files: { '<%= src.output.bootstrap.css %>': '<%= src.input.bootstrap.less %>'}
      }
    },
 
 
    // Watcher
    watch: {
      boldy: {
        files: ['less/*.less'],
        tasks: ['less:boldy_debug'],
        options: {
          spawn: false,
        },
      },
    },
 
 
    // CSSmin
    cssmin: {
      boldy: {
        options: {
          report: 'gzip',
          banner: '<%= banner %>'
        },
        files: {
          '<%= src.output.boldy.css.indefero %>': '<%= src.input.indefero %>'
        }
      }
    },
 
 
    // Uglify
    uglify: {
      boldy: {
        options: {
          report: 'gzip',
          banner: '<%= banner %>'
        },
        files: {
          '<%= src.output.boldy.js %>': '<%= src.input.js %>',
        }
      }
    }
 
  });
 
 
  // Load plugins
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-contrib-less');
  grunt.loadNpmTasks('grunt-bower-task');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-cssmin');
 
 
  // Callable tasks
  grunt.registerTask('default', ['boldy', 'cssmin', 'concat:bootstrap', 'uglify']);
  grunt.registerTask('w', ['watch:boldy']);
 
  grunt.registerTask('bootstrap', ['concat:bootstrap', 'less:bootstrap']);
  grunt.registerTask('boldy', ['less:boldy']);
 
  grunt.registerTask('full', ['bower', 'bootstrap', 'default']);
  grunt.registerTask('all', ['full']); // Alias
};

Tâche bower

Via le plugin grunt-bower-task.

Cette tâche est là pour exécuter Bower au travers de Grunt, notez que le plugin n'interprète pas le .bowerrc, je l'ai donc chargé moi même (bowerrc: grunt.file.readJSON('.bowerrc')) afin de passer les mêmes options à la tâche Grunt qu'à Bower.

Tâche Bootstrap

Via les plugins grunt-contrib-less & grunt-contrib-concat.

Le but de cette tâche est de ne pas utiliser la version distribuée de Bootstrap mais de reconstruire ma propre version. Pour celà,

  • je reconstruis le JavaScript à partir des sources et du plugin concat,
  • je recompile les CSS à partir d'une version allégée du bootstrap.less :
/* -- BEGIN LICENSE BLOCK ---------------------------------------
# This file is part of Boldy, a theme for Dotclear
#
# Theme by Site5 (http://www.s5themes.com)
# under a GPLv2 http://www.gnu.org/licenses/gpl-2.0.txt
# Ported on Dotclear by Guillaume Kulakowski (http://www.llaumgui.com)
#
# -- END LICENSE BLOCK ----------------------------------------- */
 
// Core variables and mixins
@import "../vendor/bootstrap/less/variables.less";
@import "../vendor/bootstrap/less/mixins.less";
 
// My override
@import "bootstrap_variables.less";
//@import "bootstrap_mixins.less";
 
// Reset
@import "../vendor/bootstrap/less/normalize.less";
@import "../vendor/bootstrap/less/print.less";
 
// Core CSS
@import "../vendor/bootstrap/less/scaffolding.less";
@import "../vendor/bootstrap/less/type.less";
@import "../vendor/bootstrap/less/code.less";
@import "../vendor/bootstrap/less/grid.less";
//@import "../vendor/bootstrap/less/tables.less";
@import "../vendor/bootstrap/less/forms.less";
@import "../vendor/bootstrap/less/buttons.less";
 
// Components
@import "../vendor/bootstrap/less/component-animations.less";
//@import "../vendor/bootstrap/less/glyphicons.less";
@import "../vendor/bootstrap/less/dropdowns.less";
//@import "../vendor/bootstrap/less/button-groups.less";
//@import "../vendor/bootstrap/less/input-groups.less";
@import "../vendor/bootstrap/less/navs.less";
@import "../vendor/bootstrap/less/navbar.less";
//@import "../vendor/bootstrap/less/breadcrumbs.less";
@import "../vendor/bootstrap/less/pagination.less";
@import "../vendor/bootstrap/less/pager.less";
//@import "../vendor/bootstrap/less/labels.less";
//@import "../vendor/bootstrap/less/badges.less";
//@import "../vendor/bootstrap/less/jumbotron.less";
@import "../vendor/bootstrap/less/thumbnails.less";
@import "../vendor/bootstrap/less/alerts.less";
//@import "../vendor/bootstrap/less/progress-bars.less";
//@import "../vendor/bootstrap/less/media.less";
@import "../vendor/bootstrap/less/list-group.less";
@import "../vendor/bootstrap/less/panels.less";
@import "../vendor/bootstrap/less/wells.less";
//@import "../vendor/bootstrap/less/close.less";
 
// Components w/ JavaScript
//@import "../vendor/bootstrap/less/modals.less";
@import "../vendor/bootstrap/less/tooltip.less";
//@import "../vendor/bootstrap/less/popovers.less";
@import "../vendor/bootstrap/less/carousel.less";
 
// Utility classes
@import "../vendor/bootstrap/less/utilities.less";
@import "../vendor/bootstrap/less/responsive-utilities.less";

Remarquez que j'utilise mes propres variables après celles de Bootstrap afin de les écraser et de modifier Bootstrap directement à la source.

Tâche Boldy

Via les plugins grunt-contrib-uglify, grunt-contrib-less & grunt-contrib-cssmin.

Comme en recompilant Bootstrap à partir des sources LESS j'ai adhéré au concept de LESS, j'ai réécrit le thème de mon blog en LESS.

Cette tâche boldy sert donc :

  • à générer le CSS minifié à partir des sources LESS (grunt-contrib-less),
  • à minifier la CSS pour mon thème indefero qui reste en CSS (grunt-contrib-cssmin),
  • et à minifier les Javascripts (grunt-contrib-uglify).

Tâche watch

Via le plugin grunt-contrib-watch.

Pour compiler du LESS en CSS, il y a 2 méthodes.

  • soit passer par le less.js qui va parser en JS les fichiers LESS à chaque chargement de page (2 à 3 secondes pour mon blog),
  • soit passer par une tâche watch dans Grunt, qui va écouter les modifications sur les fichiers LESS et recompiler un CSS.

C'est cette dernière solution que j'ai retenu et donc c'est à cela que sert la tâche watch.

En conclusion

Pour conclure, je dirais que la mise en place de ces outils (surtout pour la première fois) est certes chronophage, mais une fois que ça tourne, pour mettre à jour les libs (Bootstrap, jQuery, etc.), une seule ligne de commande suffit (grunt full). De plus, une fois Grunt et Bower en place (et maîtrisés), passer de CSS à LESS a été super simple.

Pour finir, je regrette presque que nodejs n'ait pas été inclus dans Fedora plus tôt car il propose de formidables outils indispensables aux développeurs (front) web.

Et pour voir ce que ça donne, une petite vidéo:

Grunt, Bower, LESS & Bootstrap

Guillaume Kulakowski
Dans mon dernier billet, j'avais évoqué mon engouement pour Bower, une solution de gestion de dépendances web. J'avais alors regretté le fait de ne pas pouvoir exécuter des tâches post-installation afin de retravailler la version distribuée de Bootstrap pour lalléger (comme on peut le faire ici). Comme j'en avais émis l'idée dans ce même billet, j'ai entrepris de ne plus utiliser Bower directement mais de lutiliser au travers de Grunt.

grunt-bower.png

Si vous ne connaissez pas encore Grunt, il s'agit d'un ordonnanceur au même titre que Maven, ant, ou encore Phing, mais basé sur nodejs et utilisant une syntaxe JavaScript.

Installation de Bower & Grunt sous Fedora 20

Après avoir installé nodejs et npm via yum, il faudra installer Bower et Grunt avec npm. En effet, Bower est absent des dépôts Fedora et Grunt est bien disponible mais sans grunt-cli, ce qui en enlève tout lintérêt...

sudo yum install npm -y
sudo npm install bower grunt grunt-cli -g

Notez au passage le fait que l'on fasse l'installation avec l'option -g pour avoir Grunt et Bower installés au niveau du système (/usr/lib/node_modules). Les autres installations se feront toujours à l'aide de npm mais sans cette option. Ceci permet de tout avoir à la racine du projet web, dans un répertoire node_modules (qu'il faudra exclure de la gestion de sources).

Voila, maintenant on rajoute un fichier packages.json et on installe les dépendances avec un npm install :

{
  "name": "Boldy",
  "version": "1.1.2",
  "description": "The Boldy theme for Dotclear",
  "repository": {
    "type": "git",
  },
  "author": "Guillaume Kulakowski",
  "homepage": "http://www.llaumgui.com",
  "devDependencies": {
    "bower": "latest",
    "grunt": "~0.4.2",
    "grunt-contrib-uglify": "latest",
    "grunt-contrib-concat": "latest",
    "grunt-contrib-less": "latest",
    "grunt-bower-task": "latest",
    "grunt-contrib-watch": "latest"
    "grunt-contrib-cssmin": "latest"
  }
}

J'ai maintenant un environnement de travail avec Bower et Grunt ainsi que les plugins nécessaires à mon projet.

Le fichier Gruntfile.js

La configuration des tâches Grunt passe par le fichier Gruntfile.js, j'ai mis le mien et vais en détailler les tâches :

module.exports = function(grunt) {
  'use strict';
 
  // Force use of Unix newlines
  grunt.util.linefeed = '\n';
 
  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    bowerrc: grunt.file.readJSON('.bowerrc'),
 
    // Path configuration from Gruntfile.js
    dirs: {
      'vendor': '<%= bowerrc.directory %>',
      'bootstrap': {
        'js': '<%= dirs.vendor %>/bootstrap/js',
        'less': '<%= dirs.vendor %>/bootstrap/less'
      },
      'css': 'css',
      'less': 'less',
      'js': 'js'
    },
 
    src: {
      output: {
        'bootstrap': {
          'js': '<%= dirs.vendor %>/bootstrap/my/js/bootstrap.js',
          'css': '<%= dirs.vendor %>/bootstrap/my/css/bootstrap.css'
        },
        'boldy': {
          css: {
            'screen': '<%= dirs.css %>/screen.css',
            'indefero': '<%= dirs.css %>/indefero.css'
          },
          js: '<%= dirs.js %>/global.js'
        }
      },
 
      input: {
        bootstrap: {
          'js': [
            '<%= dirs.bootstrap.js %>/dropdown.js',
            '<%= dirs.bootstrap.js %>/tooltip.js',
            '<%= dirs.bootstrap.js %>/collapse.js',
            '<%= dirs.bootstrap.js %>/transition.js',
            '<%= dirs.bootstrap.js %>/carousel.js'
          ],
          'less': [
            '<%= dirs.less %>/bootstrap.less'
          ]
        },
        indefero: '<%= dirs.css %>/indefero.src.css',
        less: '<%= dirs.less %>/boldy_boot.less',
        js: [
          '<%= dirs.vendor %>/jquery-cookie/jquery.cookie.js',
          '<%= src.output.bootstrap.js %>',
          '<%= dirs.vendor %>/scroll-to-top/jquery.scrollToTop.min.js',
          '<%= dirs.js %>/js/post.js',
          '<%= dirs.vendor %>/async-gravatars/async-gravatars.js',
          '<%= dirs.vendor %>/jquery-colorbox/jquery.colorbox-min.js',
          '<%= dirs.vendor %>/nwxforms/src/nwxforms.js',
          '<%= dirs.js %>/boldy.js'
        ]
      },
    },
 
    // Banner
    banner: '/*!\n' +
              ' * Boldy for Dotclear v<%= pkg.version %>\n' +
              ' * Original theme by Site5 (http://www.s5themes.com)\n' +
              ' * Under a GPLv2 http://www.gnu.org/licenses/gpl-2.0.txt\n' +
              ' * Ported on Dotclear by <%= pkg.author %> (<%= pkg.homepage %>)\n' +
              ' * Copyright 2012-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
              ' */',
 
 
 
    /********************************** Task **********************************/
    // Bower
    bower: {
      install: {
        options: {
          targetDir: '<%= dirs.vendor %>',
          cleanTargetDir: true,
          layout: 'byComponent',
          install: true,
          copy: false,
          verbose: true
        }
      }
    },
 
 
    // Concatenation
    concat: {
      bootstrap: {
        src: '<%= src.input.bootstrap.js %>',
        dest: '<%= src.output.bootstrap.js %>'
      },
    },
 
 
    // LESS
    less: {
      boldy: {
        options: {
          compress: true,
          cleancss: true,
          report: 'gzip',
          strictImports: true,
        },
        files: { '<%= src.output.boldy.css.screen %>': '<%= src.input.less %>'},
      },
      boldy_debug: {
          options: {
            compress: false,
            cleancss: false,
            report: 'none',
            strictImports: true,
          },
          files: { '<%= src.output.boldy.css.screen %>': '<%= src.input.less %>'},
      },
      bootstrap: {
        files: { '<%= src.output.bootstrap.css %>': '<%= src.input.bootstrap.less %>'}
      }
    },
 
 
    // Watcher
    watch: {
      boldy: {
        files: ['less/*.less'],
        tasks: ['less:boldy_debug'],
        options: {
          spawn: false,
        },
      },
    },
 
 
    // CSSmin
    cssmin: {
      boldy: {
        options: {
          report: 'gzip',
          banner: '<%= banner %>'
        },
        files: {
          '<%= src.output.boldy.css.indefero %>': '<%= src.input.indefero %>'
        }
      }
    },
 
 
    // Uglify
    uglify: {
      boldy: {
        options: {
          report: 'gzip',
          banner: '<%= banner %>'
        },
        files: {
          '<%= src.output.boldy.js %>': '<%= src.input.js %>',
        }
      }
    }
 
  });
 
 
  // Load plugins
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-contrib-less');
  grunt.loadNpmTasks('grunt-bower-task');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-cssmin');
 
 
  // Callable tasks
  grunt.registerTask('default', ['boldy', 'cssmin', 'concat:bootstrap', 'uglify']);
  grunt.registerTask('w', ['watch:boldy']);
 
  grunt.registerTask('bootstrap', ['concat:bootstrap', 'less:bootstrap']);
  grunt.registerTask('boldy', ['less:boldy']);
 
  grunt.registerTask('full', ['bower', 'bootstrap', 'default']);
  grunt.registerTask('all', ['full']); // Alias
};

Tâche bower

Via le plugin grunt-bower-task.

Cette tâche est là pour exécuter Bower au travers de Grunt, notez que le plugin n'interprète pas le .bowerrc, je l'ai donc chargé moi même (bowerrc: grunt.file.readJSON('.bowerrc')) afin de passer les mêmes options à la tâche Grunt qu'à Bower.

Tâche Bootstrap

Via les plugins grunt-contrib-less & grunt-contrib-concat.

Le but de cette tâche est de ne pas utiliser la version distribuée de Bootstrap mais de reconstruire ma propre version. Pour celà,

  • je reconstruis le JavaScript à partir des sources et du plugin concat,
  • je recompile les CSS à partir d'une version allégée du bootstrap.less :
/* -- BEGIN LICENSE BLOCK ---------------------------------------
# This file is part of Boldy, a theme for Dotclear
#
# Theme by Site5 (http://www.s5themes.com)
# under a GPLv2 http://www.gnu.org/licenses/gpl-2.0.txt
# Ported on Dotclear by Guillaume Kulakowski (http://www.llaumgui.com)
#
# -- END LICENSE BLOCK ----------------------------------------- */
 
// Core variables and mixins
@import "../vendor/bootstrap/less/variables.less";
@import "../vendor/bootstrap/less/mixins.less";
 
// My override
@import "bootstrap_variables.less";
//@import "bootstrap_mixins.less";
 
// Reset
@import "../vendor/bootstrap/less/normalize.less";
@import "../vendor/bootstrap/less/print.less";
 
// Core CSS
@import "../vendor/bootstrap/less/scaffolding.less";
@import "../vendor/bootstrap/less/type.less";
@import "../vendor/bootstrap/less/code.less";
@import "../vendor/bootstrap/less/grid.less";
//@import "../vendor/bootstrap/less/tables.less";
@import "../vendor/bootstrap/less/forms.less";
@import "../vendor/bootstrap/less/buttons.less";
 
// Components
@import "../vendor/bootstrap/less/component-animations.less";
//@import "../vendor/bootstrap/less/glyphicons.less";
@import "../vendor/bootstrap/less/dropdowns.less";
//@import "../vendor/bootstrap/less/button-groups.less";
//@import "../vendor/bootstrap/less/input-groups.less";
@import "../vendor/bootstrap/less/navs.less";
@import "../vendor/bootstrap/less/navbar.less";
//@import "../vendor/bootstrap/less/breadcrumbs.less";
@import "../vendor/bootstrap/less/pagination.less";
@import "../vendor/bootstrap/less/pager.less";
//@import "../vendor/bootstrap/less/labels.less";
//@import "../vendor/bootstrap/less/badges.less";
//@import "../vendor/bootstrap/less/jumbotron.less";
@import "../vendor/bootstrap/less/thumbnails.less";
@import "../vendor/bootstrap/less/alerts.less";
//@import "../vendor/bootstrap/less/progress-bars.less";
//@import "../vendor/bootstrap/less/media.less";
@import "../vendor/bootstrap/less/list-group.less";
@import "../vendor/bootstrap/less/panels.less";
@import "../vendor/bootstrap/less/wells.less";
//@import "../vendor/bootstrap/less/close.less";
 
// Components w/ JavaScript
//@import "../vendor/bootstrap/less/modals.less";
@import "../vendor/bootstrap/less/tooltip.less";
//@import "../vendor/bootstrap/less/popovers.less";
@import "../vendor/bootstrap/less/carousel.less";
 
// Utility classes
@import "../vendor/bootstrap/less/utilities.less";
@import "../vendor/bootstrap/less/responsive-utilities.less";

Remarquez que j'utilise mes propres variables après celles de Bootstrap afin de les écraser et de modifier Bootstrap directement à la source.

Tâche Boldy

Via les plugins grunt-contrib-uglify, grunt-contrib-less & grunt-contrib-cssmin.

Comme en recompilant Bootstrap à partir des sources LESS j'ai adhéré au concept de LESS, j'ai réécrit le thème de mon blog en LESS.

Cette tâche boldy sert donc :

  • à générer le CSS minifié à partir des sources LESS (grunt-contrib-less),
  • à minifier la CSS pour mon thème indefero qui reste en CSS (grunt-contrib-cssmin),
  • et à minifier les Javascripts (grunt-contrib-uglify).

Tâche watch

Via le plugin grunt-contrib-watch.

Pour compiler du LESS en CSS, il y a 2 méthodes.

  • soit passer par le less.js qui va parser en JS les fichiers LESS à chaque chargement de page (2 à 3 secondes pour mon blog),
  • soit passer par une tâche watch dans Grunt, qui va écouter les modifications sur les fichiers LESS et recompiler un CSS.

C'est cette dernière solution que j'ai retenu et donc c'est à cela que sert la tâche watch.

En conclusion

Pour conclure, je dirais que la mise en place de ces outils (surtout pour la première fois) est certes chronophage, mais une fois que ça tourne, pour mettre à jour les libs (Bootstrap, jQuery, etc.), une seule ligne de commande suffit (grunt full). De plus, une fois Grunt et Bower en place (et maîtrisés), passer de CSS à LESS a été super simple.

Pour finir, je regrette presque que nodejs n'ait pas été inclus dans Fedora plus tôt car il propose de formidables outils indispensables aux développeurs (front) web.

Et pour voir ce que ça donne, une petite vidéo:

Easybashgui 10.0.0

Matthieu Saulnier

Introduction

Cet article inaugure une petite chronique dont l'idée m'est apparue pendant l'exécution de tâches répétitives (ie: mon travail IRL). J'ai en effet réalisé que le Web foisonne d'éléments pour la construction initiale de paquets RPM, d'ordre théorique (wikis, documentations...) et d'ordre pratique (articles de blog, paquets du dépôt Fedora...). Sauf que, un paquet RPM est voué à évoluer dès sa création, les modifications provenants du programme empaqueté ou paquet en lui-même pour correspondre aux évolution du système d'empaquetage global. On ne pousse pas un paquet dans le dépôt puis on l'oublie. En se tournant vers le Web à la recherche de divers éléments, j'ai vu que la partie théorique est certes correctement abordée (wiki fedoraproject), mais que la partie pratique était juste absente. Devant ce vide, je me suis dit qu'avec mes quelques paquets il fallait tenter quelque chose... Cette chronique a plusieurs objectifs, donner une illustration pratique du processus de mise à jour afin de suciter la curiosité chez les néohpytes (oui le Projet Fedora manque de packagers pour les paquets préexistant, c'est un fait avéré), et afin de suciter la critique chez les empaqueteurs experts. Car ma technique est loin d'être parfaite, il y a toujours une occasion pour s'améliorer.

Prérequis

Avoir le groupe de paquets Fedora Packager installé sur votre machine

# yum install @rpm-development-tools

Récupération des sources du paquet

Chaque paquet du dépôt Fedora possède un petit dépôt de code source dans lequel le propriètaire du paquet peut travailler. Ce petit dépôt est visitable en ligne ici pour Easybashgui, il contient les fichiers nécessaires à la construction du RPM à savoir le fichier SPEC et l'archive source du programme empaqueté, et il utilise le système de contrôle de version GIT. On ne dit pas « télécharger » un dépôt mais « cloner », nous allons donc cloner le dépôt du paquet Easybashgui sur notre disque dur:

casper@blackbird:~/fedora-scm$ fedpkg clone -a easybashgui

L'option -a signifie « anonyme » juste parce que les accès aux dépôts sont contrôlés par les comptes FAS. La première chose à vérifier est que le paquet embarque bien la dernière version du logiciel:

casper@blackbird:~/fedora-scm/easybashgui$ egrep 'URL|Version' easybashgui.spec
Version:        8.0.1
URL:            https://sites.google.com/site/easybashgui/

Rendons-nous sur le site à l'url indiquée. Sur la page Download on voit que la version actuelle du logiciel est la 10.0.0, il est temps de mettre à jour le paquet.

Récupération des sources du logiciel

Comme nous venons de le voir, les sources du logiciel sont hébergées sur la plateforme d'hébergement Github, qui offre un système de téléchargement de l'archive source assez spécial. En fait Github dispose lui-aussi d'un système de contrôle de version, avec la possiblité d'associer un commit à un tag. Ici le commit (court) est « ad4222f », et le tag est défini arbitrairement par le développeur qui indique ici la version de son logiciel. Il nous manque encore une information avant de pouvoir commencer, la version longue de l'identifiant du commit, que l'on obtient en cliquant sur l'identiant court: ad4222f0082adc877a35c0f3984b2cc7c8319d9b. Après cette petite navigation dans Github, nous disposons de toutes les information requises pour modifier le SPEC.

casper@blackbird:~/fedora-scm/easybashgui$ head -1 easybashgui.spec                                                                                                     
%global commit f39fd3b22e7af267613d35de659b94c3f55b9fb1

On peut remplacer l'ancien commit qui indiquait la version 8.0.1 par le nouveau:

casper@blackbird:~/fedora-scm/easybashgui$ sed -i s/f39fd3b22e7af267613d35de659b94c3f55b9fb1/ad4222f0082adc877a35c0f3984b2cc7c8319d9b/ easybashgui.spec

On met à jour le tag « Version »:

casper@blackbird:~/fedora-scm/easybashgui$ sed -i 's/Version:        8.0.1/Version:        10.0.0/' easybashgui.spec

Et enfin on ajoute une entrée au %changelog:

--- easybashgui.spec.orig       2014-01-20 01:18:32.637223701 +0100
+++ easybashgui.spec    2014-01-20 01:19:52.216888031 +0100
@@ -78,6 +78,9 @@ chmod 644 easybashgui_test.sh
 
 
 %changelog
+* Mon Jan 20 2014 Matthieu Saulnier <fantom@xxxxxxxxxxxxxxx> - 10.0.0-1
+- Update to 10.0.0
+
 * Tue Aug 06 2013 Matthieu Saulnier <fantom@xxxxxxxxxxxxxxx> - 8.0.1-1
 - Update to 8.0.1
 - Upstream has moved sources on github

Avec ces modifications, nous pouvons désormais télécharger l'archive à la version du logiciel souhaitée avec l'outil « spectool »:

casper@blackbird:~/fedora-scm/easybashgui$ spectool -g -S easybashgui.spec

Maintenant commence le travail d'investigation pour savoir ce qui a changé dans le logiciel qu'il faut répercuter et adapter dans le RPM. J'ai pour habitude de copier l'archive dans ~/Téléchargements/ pour l'extraire et pouvoir fouiller en profondeur dedans.

L'évolution du logiciel

Jusqu'à la version 8.0.1 je n'utilisais pas le Makefile fourni car il était partiellement erroné (au niveau des modes des fichiers), aujourd'hui il apparait que tout est OK pour les modes des fichiers sources, nous allons donc désormais l'utiliser. Dans la partie %install du SPEC il va falloir tout remplacer par la commande « make install ».

On voit aussi que le développeur a trié ses fichiers sources dans les répertoires icons/ lib/ scr/ ce qui n'était pas le cas dans la version précédente. Du coup, la commande 'sed' dans la partie %prep du SPEC va être cassée. Sauf que, en cherchant dans l'archive, le fichier "easybashgui_test.sh" manque à l'appel, en conséquence nous allons supprimer la commande 'sed' qui n'a plus lieu d'exister.

Du coté des fichiers qui vont être installés par le RPM, le nom de certains fichiers installés a changé, par exemple l'ancien "easydialog.sh" se nomme désormais "easydialog". L'emplacement des deux fichiers de bibliothèque a également changé. Tous ces changements seront répercutés sur la section %files du SPEC.

Et enfin malgrès le développement intensif de cette bibliothèque, les dépendances indispensables à son bon fonctionnement (tag Requires dans le SPEC) semblent inchangés.

Les modifications du RPM

On ouvre son éditeur de texte préféré et on modifie le fichier SPEC dans l'ordre précédemment énoncé.

La partie %install

--- easybashgui.spec.orig       2014-01-20 01:56:56.976175885 +0100
+++ easybashgui.spec    2014-01-20 23:46:11.130181100 +0100
@@ -44,27 +44,7 @@ sed -i "s@#!/usr/bin/env bash@@" easybas
 
 
 %install
-# Install binaries :
-mkdir -p %{buildroot}%{_bindir}/
-install -pm 755 %{name}                     \
-                %{name}-debug               \
-                easydialog.sh               \
-                %{buildroot}%{_bindir}/
-# Install lib files :
-mkdir -p %{buildroot}%{_libexecdir}/%{name}/
-install -pm 755 %{name}.lib                          \
-                easybashlib                          \
-                %{buildroot}%{_libexecdir}/%{name}/
-# Install shared files :
-mkdir -p %{buildroot}%{_datadir}/%{name}/
-install -pm 644 Ok.xpm                            \
-                Attenzione.xpm                    \
-                %{buildroot}%{_datadir}/%{name}/
-# Install man file
-mkdir -p %{buildroot}%{_mandir}/man1/
-install -pm 644 %{name}.1* %{buildroot}%{_mandir}/man1/
-# Fix mode of easybashgui_test.sh :
-chmod 644 easybashgui_test.sh
+make install DESTDIR=%{buildroot}
 
 
 %files

La partie %prep

--- easybashgui.spec.orig       2014-01-20 23:49:16.987846224 +0100
+++ easybashgui.spec    2014-01-20 23:54:40.296437416 +0100
@@ -35,8 +35,6 @@ lancé ou non.
 
 %prep
 %setup -qn %{name}-%{commit}
-# Remove shebang from easybashgui_test.sh :
-sed -i "s@#!/usr/bin/env bash@@" easybashgui_test.sh
 
 
 %build

La partie %files

Cette partie mérite quelques explications avant de balancer le diff. En effet si on lit le Makefile on aperçoit que les fichiers de documentation (README, EasyBashGUI-license) sont installés par le 'make install'. Rien d'extraordinaire en soi, sauf que dans cette partie existe déjà une macro sensée copier automatiquement ces fichiers doc dans le répertoire /usr/share/doc/ et d'assigner la proprièté de ces fichier au paquet. La copie des fichiers de la macro %doc fait un peu doublon avec le Makefile, mais il faut toutefois que la proprièté des fichiers soit assignée au paquet. Pour cela nous allons simplement ajouter le répertoire des fichiers doc à la liste des fichiers dont le paquet est propriètaire, et enlever la macro %doc. Pour la traduction des macros de chemin de fichier, c'est par ici (juste au cas où).

--- easybashgui.spec.orig       2014-01-21 00:55:31.425925488 +0100
+++ easybashgui.spec    2014-01-21 01:00:31.694894978 +0100
@@ -46,13 +46,13 @@ make install DESTDIR=%{buildroot}
 
 
 %files
-%doc README EasyBashGUI-license easybashgui_test.sh
 %{_bindir}/%{name}
 %{_bindir}/%{name}-debug
-%{_bindir}/easydialog.sh
+%{_bindir}/easydialog
 %{_datadir}/%{name}/
-%{_libexecdir}/%{name}/
+%{_prefix}/lib/%{name}/
 %{_mandir}/man1/%{name}.1*
+%{_docdir}/%{name}/
 
 
 %changelog

La partie %changelog

Ah tiens, plus haut j'ai omis de préciser... que toutes nos modifications doivent être consciencieusement consignées dans le Changelog du paquet. Alors pas la peine d'écrire un roman, il faut être bref et précis. En voici un exemple:

--- easybashgui.spec.orig       2014-01-21 01:10:16.772114046 +0100
+++ easybashgui.spec    2014-01-21 01:16:30.220338188 +0100
@@ -58,6 +58,10 @@ make install DESTDIR=%{buildroot}
 %changelog
 * Mon Jan 20 2014 Matthieu Saulnier <fantom@
xxxxxxxxxxxxxxx> - 10.0.0-1
 - Update to 10.0.0
+- Use makefile instead of scriplet in %%install section
+- Remove sed statement in %%prep section
+- Remove %%doc macro in %%files section
+- Update %%files section according the makefile
 
 * Tue Aug 06 2013 Matthieu Saulnier <fantom@xxxxxxxxxxxxxxx> - 8.0.1-1
 - Update to 8.0.1

Vous aurez remarqué que dans le changelog j'ajoute un « % » avant chaque nom de section, c'est juste pour que ces macros ne soit pas interprétées au moment de la construction du paquet. Alors ça y est, nous allons enfin pourvoir le construire ce paquet. Mais avant...

Enregistrement des modifications du GIT

N'oublions pas que nous sommes encore dans notre petit dépôt GIT et que toutes les modifications que nous venons d'apporter n'ont pas encore d'identifiant d'enregistrement. Mais avant il faut encore ajouter l'archive source aux fichiers « sources » (c'est comme ça qu'il s'appelle) et « .gitignore » du dépôt. L'archive sera également mise en ligne en une seule passe.

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg new-sources easybashgui-10.0.0-ad4222f.tar.gz

Et enfin on enregistre les changements, en ajoutant un message expliquant sommairement ces modifications:

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg commit -m "Update to 10.0.0 version"

Cet enregistrement n'est présent que sur notre disque dur, il faut donc synchroniser notre dépôt local avec le dépôt en ligne. Pour cela on dit qu'on « pousse » les modifications, d'où la commande suivante:

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg push

Construction du paquet pour Rawhide

Maintenant nos modifications sont mises en ligne, nous pouvons construire le paquet contenant la dernière version du logiciel, mais seulement pour la branche Rawhide. Explication. Tout ce que nous venons de faire était dans la branche "master" du GIT, cette branche est la première branche à être modifiée, et elle correspond à la branche en évolution permanante de Fedora, c'est à dire Rawhide. Si tout se passe bien dans cette branche, alors on peut copier les changement dans les branches plus anciennes telles que f20 puis f19.

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg build --nowait
Building easybashgui-10.0.0-1.fc21 for rawhide
Created task: 6432471
Task info: http://koji.fedoraproject.org/koji/taskinfo?taskID=6432471

Si le build a réussi, alors cette version du paquet sera présente d'office dans f21, f22, etc... jusqu'à ce que l'on remette à jour la branche master.

Faire une update pour f20

Si les changements du logiciel n'influancent pas de façon majeure l'expérience utilisateur et développeur d'une version de Fedora, alors nous pouvons produire une mise à jour pour cette version. Il faut que la version soit tout de même en court de support par le Projet, en l'occurence f20 et f19. Commençons par changer de branche dans notre dépôt local:

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg switch-branch f20

Puis on applique les changements fait dans la branche master aux fichiers de la branche f20, heureusement pour nous tout cela est fait automatiquement avec une seule commande:

casper@blackbird:~/fedora-scm/easybashgui$ git merge master

On n'oublie pas de synchroniser cette branche de notre dépôt local avec la branche du dépôt en ligne:

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg push

Et on peut enfin construire notre paquet. Cette branche n'étant pas une branche de test, les échecs de constructions sont plutôt rares, pour ma part c'était à chaque fois parce que j'avais poussé un peu précipitament les changements de master avant que sa reconstruction du paquet ne soit terminée.

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg build --nowait
Building easybashgui-10.0.0-1.fc20 for f20-candidate
Created task: 6436984
Task info: http://koji.fedoraproject.org/koji/taskinfo?taskID=6436984

Lorsque ce paquet sera construit, il sera taggé en tant que paquet candidat de mise à jour, ce qui signifie qu'il ne sera poussé dans aucun dépôt (updates-testing, updates) avant que je ne le déclare apte. Typiquement je dois remplir un petit descriptif qui permettra aux utilisateurs de connaître la nature de cette mise à jour (sécurité, avancement, etc..), les bugs qu'il corrige, et c'est ce formulaire assigné au paquet qui permettra aux testeurs de lui donner une note et un commentaire. C'est également cette étiquette qui permet de suivre la progression du paquet dans les différents dépôts (updates-testing, puis updates).

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg update
Creating a new update for  easybashgui-10.0.0-1.fc20
Password for fantom:
Creating a new update for  easybashgui-10.0.0-1.fc20
Update successfully created
================================================================================
     easybashgui-10.0.0-1.fc20
================================================================================
    Release: Fedora 20
     Status: pending
       Type: enhancement
      Karma: 0
    Request: testing
      Notes: Update to 10.0.0
  Submitter: fantom
  Submitted: 2014-01-21 23:09:01
   Comments: bodhi - 2014-01-21 23:09:04 (karma 0)
             This update has been submitted for testing by fantom.

  https://admin.fedoraproject.org/updates/easybashgui-10.0.0-1.fc20

Après cette opération, le paquet est taggé en tant que paquet de mise à jour en attente. En attente avant d'effectivement intègrer le dépôt updates-testing, il y sera poussé sous 24/48h environ. Ce délai est nécessaire pour laisser le temps à la personne en charge de la clé de signature GPG du Projet Fedora d'aposer la signature sur ce paquet. D'ici 7 jours, si la mise à jour ne reçoit aucune note négative, je la pousserais dans le dépôt updates comme le veut le règlement des mises à jour de Fedora.

Et pour f19 ?

Renouveler l'opération pour f20 en adaptant :-D


Proxy SOCKSv5 via SSH

Matthieu Saulnier

C'est non-pas sans une certaine émotion que j'ai le plaisir d'annoncer aux personnes ayant un compte SSH sur mon serveur, qu'elles peuvent utiliser mon serveur comme Proxy pour n'importe quel navigateur supportant le protocole SOCKS version 5.

En réalité j'ai rien fait. J'ai juste trouvé/testé par hasard cet article.

Le seul intérêt que je vois à l'instant est d'avoir un tunnel IPv6, peut-être aussi une adresse géographique fixe et neutre...

PHP 5.4.24 et 5.5.8

Remi Collet

Les RPM de PHP version 5.5.8 sont disponibles dans le dépôt remi pour Fedora et dans le dépôt remi-php55 pour Enterprise Linux.

Les RPM de PHP version 5.4.24 sont disponibles dans le dépôt remi pour Enterprise Linux (RHEL, CentOS...).

Annonces des versions :

Installation de PHP 5.5

yum --enablerepo=remi-php55,remi update php\*

Installation de PHP 5.4

yum --enablerepo=remi update php\*

Et bientôt dans les mises à jour officielles:

À noter :

  • la version EL6 est contruite avec RHEL-6.5
  • pour php 5.5, l'extension Zip est désormais fournit dans le paquet php-pecl-zip.
  • beaucoup de nouvelles extensions sont aussi disponible, voir PECL extension RPM status page

Informations, lire :

Bower pour gérer les dépendances du thème de mon blog

Guillaume Kulakowski

C'est à la lecture de cet excellent article de Raphaël Goetter (dont le livre "CSS avancées vers HTML5 et CSS3" fut un de mes livres de chevet) sur Alsacreations que j'ai décidé de mettre en place Bower pour gérer les dépendances du thème de mon blog.

Pour ceux qui ne connaissent pas (encore) Bower et qui n'ont pas eu la curiosité de cliquer sur les liens ci-dessus: sachez juste que Bower est un gestionnaire de paquets pour le web (JS, CSS, etc). On pourrait même faire le raccourci en disant que Bower est au web ce que Composer est à PHP.

Les avantages immédiats que j'y trouve :

  • Un simple bower update et je mets à jour toutes les librairies tierces.
  • Le cloisonnement entre mon code et le code tiers. En effet, ce dernier se trouve dans un répertoire séparé: vendor (les habitudes de symfony2 ;-)).
  • Comme au travail je fais beaucoup de Symfony2 et d'eZ Publish 5, j'utilise pas mal composer, avec Bower je ne suis donc pas perdu.

Les inconvénients que j'y trouve :

  • Bower ne fait que récupérer les dépendances. Il ne permet pas (encore), comme (entre autre) Composer, de lancer des scripts post-installation ou post-mise-à-jour.
  • Bower récupère Bootstrap dans son intégralité alors que moi, j'aimerais l'optimiser et en réduire le poids.

Avant de pouvoir passer en production cette nouvelle version de mon blog, qui se doit d'être ISO avec la précédente, il me reste donc à régler quelques problèmes :

  • Optimiser ou reconstruire Bootstrap après l'avoir récupéré.
  • Minifier tout mon code.
  • Réfléchir à comment le pousser en production.
    En effet, Bower tournant sous node.js, je n'ai pas spécialement envie de déployer node sur mon serveur. Jusquà présent jutilisais GIT pour déployer le code source et je lançais juste un script shell pour minifier CSS et JS via YUI Compressor. Là je pense que je vais, soit devoir héberger les scripts minifiés sur GIT (ce qui n'est pas une bonne pratique) soit mettre en place un Jenkins (pour la construction du paquet) et un Capistrano (pour le déploiement). Autant au boulot le couple Jenkins/Capistrano m'est indispensable autant là pour déployer une fois de temps en temps une nouvelle version de mon blog, je pense que je vais opter pour les fichiers dans GIT.

Pour ceux que ça intéressent, ma configuration Bower :

# cat .bowerrc
{
    "directory": "vendor"
}
# cat bower.json
{
    "name": "Boldy",
    "version": "1.1",
    "main": [
        "css/screen.css",
        "css/indefero.css",
        "js/global.js"
    ],
    "ignore": [
        ".jshintrc",
        "**/*.txt"
    ],
    "private": true,
    "dependencies": {
        "jquery": "~1.*",
        "bootstrap": "3.0.*",
        "jquery.browser": "latest",
        "jquery-colorbox": "latest",
        "jquery-cookie": "latest",
        "scroll-to-top": "latest",
        "headjs": "latest"
    }
}

Bower pour gérer les dépendances du thème de mon blog

Guillaume Kulakowski

C'est à la lecture de cet excellent article de Raphaël Goetter (dont le livre "CSS avancées vers HTML5 et CSS3" fut un de mes livres de chevet) sur Alsacreations que j'ai décidé de mettre en place Bower pour gérer les dépendances du thème de mon blog.

Pour ceux qui ne connaissent pas (encore) Bower et qui n'ont pas eu la curiosité de cliquer sur les liens ci-dessus: sachez juste que Bower est un gestionnaire de paquets pour le web (JS, CSS, etc). On pourrait même faire le raccourci en disant que Bower est au web ce que Composer est à PHP.

Les avantages immédiats que j'y trouve :

  • Un simple bower update et je mets à jour toutes les librairies tierces.
  • Le cloisonnement entre mon code et le code tiers. En effet, ce dernier se trouve dans un répertoire séparé: vendor (les habitudes de symfony2 ;-)).
  • Comme au travail je fais beaucoup de Symfony2 et d'eZ Publish 5, j'utilise pas mal composer, avec Bower je ne suis donc pas perdu.

Les inconvénients que j'y trouve :

  • Bower ne fait que récupérer les dépendances. Il ne permet pas (encore), comme (entre autre) Composer, de lancer des scripts post-installation ou post-mise-à-jour.
  • Bower récupère Bootstrap dans son intégralité alors que moi, j'aimerais l'optimiser et en réduire le poids.

Avant de pouvoir passer en production cette nouvelle version de mon blog, qui se doit d'être ISO avec la précédente, il me reste donc à régler quelques problèmes :

  • Optimiser ou reconstruire Bootstrap après l'avoir récupéré.
  • Minifier tout mon code.
  • Réfléchir à comment le pousser en production.
    En effet, Bower tournant sous node.js, je n'ai pas spécialement envie de déployer node sur mon serveur. Jusquà présent jutilisais GIT pour déployer le code source et je lançais juste un script shell pour minifier CSS et JS via YUI Compressor. Là je pense que je vais, soit devoir héberger les scripts minifiés sur GIT (ce qui n'est pas une bonne pratique) soit mettre en place un Jenkins (pour la construction du paquet) et un Capistrano (pour le déploiement). Autant au boulot le couple Jenkins/Capistrano m'est indispensable autant là pour déployer une fois de temps en temps une nouvelle version de mon blog, je pense que je vais opter pour les fichiers dans GIT.

Pour ceux que ça intéressent, ma configuration Bower :

# cat .bowerrc
{
    "directory": "vendor"
}
# cat bower.json
{
    "name": "Boldy",
    "version": "1.1",
    "main": [
        "css/screen.css",
        "css/indefero.css",
        "js/global.js"
    ],
    "ignore": [
        ".jshintrc",
        "**/*.txt"
    ],
    "private": true,
    "dependencies": {
        "jquery": "~1.*",
        "bootstrap": "3.0.*",
        "jquery.browser": "latest",
        "jquery-colorbox": "latest",
        "jquery-cookie": "latest",
        "scroll-to-top": "latest",
        "headjs": "latest"
    }
}

Bower pour gérer les dépendances du thème de mon blog

Guillaume Kulakowski

C'est à la lecture de cet excellent article de Raphaël Goetter (dont le livre "CSS avancées vers HTML5 et CSS3" fut un de mes livres de chevet) sur Alsacreations que j'ai décidé de mettre en place Bower pour gérer les dépendances du thème de mon blog.

Pour ceux qui ne connaissent pas (encore) Bower et qui n'ont pas eu la curiosité de cliquer sur les liens ci-dessus: sachez juste que Bower est un gestionnaire de paquets pour le web (JS, CSS, etc). On pourrait même faire le raccourci en disant que Bower est au web ce que Composer est à PHP.

Les avantages immédiats que j'y trouve :

  • Un simple bower update et je mets à jour toutes les librairies tierces.
  • Le cloisonnement entre mon code et le code tiers. En effet, ce dernier se trouve dans un répertoire séparé: vendor (les habitudes de symfony2 ;-)).
  • Comme au travail je fais beaucoup de Symfony2 et d'eZ Publish 5, j'utilise pas mal composer, avec Bower je ne suis donc pas perdu.

Les inconvénients que j'y trouve :

  • Bower ne fait que récupérer les dépendances. Il ne permet pas (encore), comme (entre autre) Composer, de lancer des scripts post-installation ou post-mise-à-jour.
  • Bower récupère Bootstrap dans son intégralité alors que moi, j'aimerais l'optimiser et en réduire le poids.

Avant de pouvoir passer en production cette nouvelle version de mon blog, qui se doit d'être ISO avec la précédente, il me reste donc à régler quelques problèmes :

  • Optimiser ou reconstruire Bootstrap après l'avoir récupéré.
  • Minifier tout mon code.
  • Réfléchir à comment le pousser en production.
    En effet, Bower tournant sous node.js, je n'ai pas spécialement envie de déployer node sur mon serveur. Jusquà présent jutilisais GIT pour déployer le code source et je lançais juste un script shell pour minifier CSS et JS via YUI Compressor. Là je pense que je vais, soit devoir héberger les scripts minifiés sur GIT (ce qui n'est pas une bonne pratique) soit mettre en place un Jenkins (pour la construction du paquet) et un Capistrano (pour le déploiement). Autant au boulot le couple Jenkins/Capistrano m'est indispensable autant là pour déployer une fois de temps en temps une nouvelle version de mon blog, je pense que je vais opter pour les fichiers dans GIT.

Pour ceux que ça intéressent, ma configuration Bower :

# cat .bowerrc
{
    "directory": "vendor"
}
# cat bower.json
{
    "name": "Boldy",
    "version": "1.1",
    "main": [
        "css/screen.css",
        "css/indefero.css",
        "js/global.js"
    ],
    "ignore": [
        ".jshintrc",
        "**/*.txt"
    ],
    "private": true,
    "dependencies": {
        "jquery": "~1.*",
        "bootstrap": "3.0.*",
        "jquery.browser": "latest",
        "jquery-colorbox": "latest",
        "jquery-cookie": "latest",
        "scroll-to-top": "latest",
        "headjs": "latest"
    }
}

Fedora 20 et Chromium

Guillaume Kulakowski

Vous le saviez peut-être, mais pour des raisons de bonnes pratiques et de fork, l'incorporation de Chromium au sein de Fedora n'est pas (encore) possible. Si vous avez loupé lexplication, je vous conseil cet excellent article de Framasoft.

Jusquà présent, Spot distribuait les RPMs de Chromium sur un dépôt tiers hébergé par FedoraPeople. Il a décidé darrêter ce support à partir de Fedora 20. De plus, le moteur v8 distribué rentre en conflit avec celui natif de Fedora, ce qui fait qu'on ne peut plus utiliser ses RPMs de F19 sous F20 (en tout cas, pas si vous voulez utiliser conjointement node.js). Cependant, pas de panique : une alternative existe grâce à nos amis russes : le dépôt Chromium Russian Fedora au travers de la plateforme Copr.

La documentation française de Fedora est dores et déjà à jour, car la question commence à devenir récurrente sur les forums de Fedora-Fr.

Fedora 20 et Chromium

Guillaume Kulakowski

Vous le saviez peut-être, mais pour des raisons de bonnes pratiques et de fork, l'incorporation de Chromium au sein de Fedora n'est pas (encore) possible. Si vous avez loupé lexplication, je vous conseil cet excellent article de Framasoft.

Jusquà présent, Spot distribuait les RPMs de Chromium sur un dépôt tiers hébergé par FedoraPeople. Il a décidé darrêter ce support à partir de Fedora 20. De plus, le moteur v8 distribué rentre en conflit avec celui natif de Fedora, ce qui fait qu'on ne peut plus utiliser ses RPMs de F19 sous F20 (en tout cas, pas si vous voulez utiliser conjointement node.js). Cependant, pas de panique : une alternative existe grâce à nos amis russes : le dépôt Chromium Russian Fedora au travers de la plateforme Copr.

La documentation française de Fedora est dores et déjà à jour, car la question commence à devenir récurrente sur les forums de Fedora-Fr.

Fedora 20 et Chromium

Guillaume Kulakowski

Vous le saviez peut-être, mais pour des raisons de bonnes pratiques et de fork, l'incorporation de Chromium au sein de Fedora n'est pas (encore) possible. Si vous avez loupé lexplication, je vous conseil cet excellent article de Framasoft.

Jusquà présent, Spot distribuait les RPMs de Chromium sur un dépôt tiers hébergé par FedoraPeople. Il a décidé darrêter ce support à partir de Fedora 20. De plus, le moteur v8 distribué rentre en conflit avec celui natif de Fedora, ce qui fait qu'on ne peut plus utiliser ses RPMs de F19 sous F20 (en tout cas, pas si vous voulez utiliser conjointement node.js). Cependant, pas de panique : une alternative existe grâce à nos amis russes : le dépôt Chromium Russian Fedora au travers de la plateforme Copr.

La documentation française de Fedora est dores et déjà à jour, car la question commence à devenir récurrente sur les forums de Fedora-Fr.

janvier 2014

Premier Samedi Date : samedi 4 janvier 2014 Horaires : de 14h00 à 18h00 Lieu : Carrefour Numérique, Cité des Sciences et de lIndustrie, Paris Pour une nouvelle installation ou pour des ajustements de votre distribution GNU/Linux Fedora, Mageia ou Ubuntu, venez nous retrouver le samedi 4 janvier 2014 au Carrefour Numérique de la Cité des Sciences […]

Bascule de Gnome vers KDE

Remi Collet

Certains penseront sans doute que ne fais que suivre la mode...

Pour mémoire, j'utilise Linux sur mon ordinateur de bureau depuis Red Hat Linux 8 (aka Psyche), donc depuis 2002. Depuis cette date, après avoir rapidement testé KDE, j'ai choisi d'utiliser l'environnement Gnome.

Pendant plus de 10 ans j'ai donc considéré Gnome comme le meilleur environnement de Bureau, et je l'ai énormément défendu.

J'ai été parmi les premiers à tester Gnome Shell (dès F14), à l'adopter rapidement et à le défendre devant ses nombreux détracteurs.

Je suis habituellement très fidèle et je ne change pas facilement d'avis au premier petit problème. Oui, il y avait besoin de changement, Gnome 2 était devenu obsolète, et Gnome 3 a fait des choix courageux.

Je suis sans doute un utilisateur un peu particulier (mais on est tous différents), je n'utilise pratiquement aucune des applications intégrées à Gnome, je reste fidèle depuis mes début à Firefox, Thunderbird, X(Hex)chat. Mes principaux outils sont le terminal et l'éditeur de texte et je ne personnalise pratiquement pas l'environnement.

Mais voila, à force d'entendre des critiques, j'ai fini par les trouver justifiées, et je ne peux plus trouver d'excuses au projet. Et dernièrement j'ai aussi mes critiques.

  • Les polices sont troubles depuis F20 (j'ai du passer sous Liberation).
  • Lancer une application est devenu trop compliqué, il faut connaitre son nom, l'abandon d'un arbre par catégorie est juste un erreur de plus.
  • Software n'est vraiment pas une application permettant de gérer ses installations / mises à jour (essayer d'installer PHP....)
  • Le déplacement des options de menu dans le menu global (AppMenu) est juste inutile est pas prêt quand on est incapable de détecter si ce menu est disponible ou pas (en session ssh par exemple)
  • Ctrl-Alt-L devenu Super-L (pour plaire à qui ?)

Ok, beaucoup sont des points de détails, ou des bugs temporaires. Mais voila c'en est trop pour moi, alors j'ai décidé de changer d'environnement et depuis quelques jours je "teste" KDE.

Voila mes réglages actuels (pour les retrouver au besoin), rien de bien compliqué, juste histoire de conserver mes habitudes :

  • Tableau de bord
  • Haut de l'écran
  • Gestionnaire des tâches : Afficher uniquement les tâches du bureau actuel
  • Horloge numérique : Format de la date : court
  • Comportement de l'espace de travail
  • Bureaux virtuels
  • Nombre de bureaux: 4
  • Nombres de lignes: 4
  • Composants graphiques différents sur chaque bureau (pour le fond d'écran)
  • Changements de bureau: Ctrl-Alt-Haut/Bas
  • Bord de l'écran
  • Changer d'écran sur le bord: Seulement lors du déplacement des fenêtres
  • Delai d'activation: 50ms (le mode "exposition" me sert comme principal outil de changement de tâche)
  • Comportements des fenêtres
  • Changeur de tâches
  • Afficher la fenêtre sélectionnée: Non
  • Grandes icones
  • Demarrage et arrêt
  • Option d'extinction par defaut: Eteindre
  • A la connexion: Démarrer une session vide
  • Konsole
  • Barre de défilement: illimité
  • Couleur: noir sur blanc
  • Barre des onglets: au dessus
  • Kate
  • Modules externes: barre d'onglets
  • Verouiller les composants graphiques

J'utilise clairement KDE à minima, comme j'utilisais Gnome. Pour l'instant ça me convient.

Aujourd'hui je comprends mieux tout ceux qui ont abandonné Gnome, mais je ne serais pas un promoteur de Kde, juste un simple utilisateur.

Fin de vie de la Fedora 18

Edouard Bourguignon

L'annonce de la date de fin de vie (EOL) pour la Fedora 18 vient de tomber.

Suite à la sortie de la Fedora 20, la Fedora 18 n'aura donc plus de mise à jour à partir du 14 janvier 2014.

Il n'y aura donc plus de support sur cette version, si vous ne mettez pas à jour vers la Fedora 19 ou 20, ce sera à vos risques et périls.

Pour rappel, le cycle de vie pour Fedora c'est une version majeure tous les 6 mois, et seulement les 2 dernières sont maintenues (mises à jour de sécurité, corrections de bugs etc).

Peut être l'occasion de tester l'outil fedup pour mettre à jour.

La Fedora 20 "Heisenbug" est sortie

Edouard Bourguignon

Et voilà, la version finale de la Fedora 20 vient de sortir. Elle coïncide avec le 10e anniversaire du projet Fedora, et ce veut aussi un hommage à Seth Vidal, developpeur principale des projets YUM, et grand contributeur de projets libres, qui nous a quitté en juillet dernier. Cette version de Fedora lui est donc dédiée.

Pour voir la liste des changements: ici sur le site officiel, ou quand j'en avais parlé précédemment.

Les notes officielles de sortie sont ici. Pour télécharger la Fedora 20, il faut aller sur la page officielle du projet.

Gnome F20

Fedora 20 "Heisenbug" is here!

Fedora Tunisia

Finally after seven days of delay, the final Fedora 20 Heisenbug is here!

read more

Fedora 20 "Heisenbug" is here!

Fedora Tunisia

Finally after seven days of delay, the final Fedora 20 Heisenbug is here!

read more

PHP 5.4.23 et 5.5.7

Remi Collet

Les RPM de PHP version 5.5.7 sont disponibles dans le dépôt remi pour Fedora et dans le dépôt remi-php55 pour Enterprise Linux.

Les RPM de PHP version 5.4.23 sont disponibles dans le dépôt remi pour Enterprise Linux (RHEL, CentOS...).

Attention Attention : Cette mise à jour corrige une faille de sécurité critique (CVE-2012-6420).

Annonces des versions :

Installation de PHP 5.5

yum --enablerepo=remi-php55,remi update php\*

Installation de PHP 5.4

yum --enablerepo=remi update php\*

Et bientôt dans les mises à jour officielles:

À noter :

  • PHP 5.5 est désormais dans le nouveau dépôt remi-php55 au lieu de remi-test pour Enterprise Linux et a remplacé PHP 5.4 dans le dépôt remi pour Fedora ≤ 18.
  • php-oci8 utilise désormais les clients Oracle version 12.1
  • pour php 5.5, l'extension Zip est désormais fournit dans le paquet php-pecl-zip.
  • beaucoup de nouvelles extensions sont aussi disponible, voir PECL extension RPM status page

Informations, lire :

phpMyAdmin version 4.1

Remi Collet

Les RPM pour installer la nouvelle version majeure de phpMyAdmin sont disponibles dans le dépôt remi pour fedora et enterprise linux (RHEL, CentOS, ...).

Site officiel : http://www.phpmyadmin.net/

Je ne sais pas encore si cette nouvelle version majeure sera aussi disponible dans les mises à jour officielles de Fedora ou de EPEL, mais la mise à jour semble bloquée par les règles sur les bibliothèques embarquées. Donc il est disponible pour fedora 14 à 20 et enterprise linux 5 à 6 (à condition d'utiliser une version de php suffisante, aussi disponible dans le dépôt).

Comme toujours :
yum --enablerepo=remi install phpMyAdmin

Je vous laisse découvrir cette nouvelle version qui intègre beaucoup de nouveautés (ajax, graphique, préférences, ...), et remonter vos impressions.

Page générée le 15 sept 2014 à 01:01