IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Installation de nodejs et less pour Symfony2 sous Centos 7 [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Points : 516
    Points
    516
    Par défaut Installation de nodejs et less pour Symfony2 sous Centos 7
    Bonjour,

    Je suis en train de préparer mon serveur Centos 7 pour accueillir une application sous Symfony2.
    Je déploie mon application avec Capifony (http://capifony.org/) et mon application se déploie sans soucis.

    Lorsque je vais sur mon serveur, et que je veux compiler mes fichiers less avec la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    admin@server:/path/to/symfony/project $ php app/console assetic:dump --env=prod --no-debug
    j'ai en retour l'erreur suivante :

    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
     
    [Assetic\Exception\FilterException]
      An error occurred while running:
      '/usr/local/bin/node' '/tmp/assetic_lessWAAyci'
      Error Output:
      module.js:338
          throw err;
                ^
      Error: Cannot find module 'less'
          at Function.Module._resolveFilename (module.js:336:15)
          at Function.Module._load (module.js:278:25)
          at Module.require (module.js:365:17)
          at require (module.js:384:17)
          at Object.<anonymous> (/tmp/assetic_lessWAAyci:1:74)
          at Module._compile (module.js:460:26)
          at Object.Module._extensions..js (module.js:478:10)
          at Module.load (module.js:355:32)
          at Function.Module._load (module.js:310:12)
          at Function.Module.runMain (module.js:501:10)
    Comme le message l'indique, il ne trouve pas le module less. Le problème est que j'ai bien nodejs d'installé et j'ai bien fait un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    admin@server:~$ sudo npm install less -g
    J'ai donc bien nodejs (/usr/local/bin/node) et j'ai bien le dossier de modules dans /usr/local/lib/node_modules/ avec dedans un dossier less. J'ai donc spécifié à mon application dans config.yml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    assetic:
        less:
            node: "/usr/local/bin/node"
            node_paths: ["/usr/local/lib/node_modules"]
            apply_to: "\.less$"
    Je précise que lorsque je teste la compilation de fichier less en ligne de commande du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    admin@server:~$ lessc style.less style.css
    et bien ça fonctionne.

    Je suis perdu parce que je ne sais pas trop quoi faire. J'ai beau réinstaller nodejs et npm, rien à faire. Si quelqu'un a une idée ?

    Merci
    M. Lebowski : Avez-vous un emploi, monsieur ?
    Le Duc : Un emploi ?
    M. Lebowski : Ne me dites pas que vous cherchez un emploi dans cette tenue un jour de semaine ?
    Le Duc : Un jour de… Quel jour on est ?

  2. #2
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Bonjour,
    Essai plutôt avec less.php
    https://github.com/oyejorge/less.php
    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
    assetic: 
        debug:          %kernel.debug%
        use_controller: false
        bundles:        [YourBundle]
        assets:           
            css_front:
                inputs:
                    #- %kernel.root_dir%/../src/Inscreen/AppBundle/Resources/public/css/googlefont.css
                    #- ....
                filters:
                    - lessphp
                    #- cssrewrite
                    #- yui_css
                output: css/stylesheet.css
        filters:
            lessphp:
                 file: %kernel.root_dir%/../vendor/oyejorge/less.php/lessc.inc.php
                 apply_to: "\.less"
    et dans ton composer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {
        #....
        "require": {
            #.....
            "oyejorge/less.php": "v1.7.0.2"
            #.....
    And by the way i hate assetic (très lourd )

    sinon moi je lance pas cette commande en prod, je la lance en dev et je versionne seulement le résultat "css/stylesheet.css"

    du coup j'ai pas besoin de la lancer dans chaque env.
    Je suis Développeur Senior ouvert aux opportunités
    Mon blog

  3. #3
    Membre confirmé
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Points : 516
    Points
    516
    Par défaut
    Merci, je n'y avais pas pensé. C'est une solution alternative qui peut fonctionner mais je voudrais comprendre et résoudre ce problème sinon je n'arriverais plus à me regarder dans une glace
    Par contre, ta réponse me fait dire qu'il faudrait que je me replonge dans la doc de la gestion des assets...
    M. Lebowski : Avez-vous un emploi, monsieur ?
    Le Duc : Un emploi ?
    M. Lebowski : Ne me dites pas que vous cherchez un emploi dans cette tenue un jour de semaine ?
    Le Duc : Un jour de… Quel jour on est ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    J'ai eu un probleme similaire, résolu comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //à ajouter au début app/console
    unset($_SERVER['NODE_PATH']);
    Le probleme est que si la variable d'environnement est déjà définie (dans $_SERVER donc), alors le process n'utilise pas le path définie dans config.yml.
    Cela vient sans doute de la façon dont less a été installé et par quel utilisateur unix.
    Tu peux tester tout d'abord en ajoutant un print_r($_SERVER); dans app/console.



    Mon avis concernant l'utilisation de less.php:
    Pour le front end, les outils fournis par javascript et node sont + nombreux, + fiable et + standard que ceux en php.
    au delà de less, on peut utiliser :
    - uglify : uglify: http://symfony.com/doc/current/cookb.../uglifyjs.html
    - bower
    - ...

  5. #5
    Membre confirmé
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Points : 516
    Points
    516
    Par défaut
    Salut arnooo999,

    Je suis d'accord avec toi, on a à notre disposition des outils comme node, etc. qui sont quand même super puissants et plus standard.
    @phppiste, le problème ne vient pas d'assetic. J'ai fait le test sur ma machine en local en basculant mon application en prod, et en faisant mon dump des fichiers => la compilation se passe bien. Mon appli tourne du feu de dieu !

    Non le problème vient du fait que sur mon serveur, il ne trouve pas node_modules lorsque je lance la commande php app/console assetic:dump --env=prod. Et j'ai besoin de la lancer car lors de mon déploiement cette commande est lancée justement en fin de script pour compiler les fichiers pour la version de prod.

    J'ai fait un test en local où j'ai volontairement cassé le path vers node_modules et j'ai bien le même résultat : "module less introuvable". Donc là, j'ai mieux ciblé le problème : il ne vient pas de node (qu'il trouve) mais de node_modules qu'il ne trouve pas.

    Lorsque je fais un print_r($_SERVER), j'ai le résultat suivant :

    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
     
    Array
    (
        [...]
        [USER] => dasifp
        [LS_COLORS] => [...]
        [MAIL] => /var/spool/mail/dasifp
        [PATH] => /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dasifp/.local/bin:/home/dasifp/bin:/usr/local/lib/
        [PWD] => /var/www/xmlreader-dasifp01.cg31.priv/current
        [LANG] => fr_FR.UTF-8
        [...]
        [HOME] => /home/dasifp
        [LOGNAME] => dasifp
        [...]
        [LESSOPEN] => ||/usr/bin/lesspipe.sh %s
    )
    Pas de NODE_PATH par contre j'ai un LESSOPEN...

    Je ne sais pas si ça te parles plus arno ? En tout cas pas de NODE_PATH.

    Ton idée de l'utilisateur unix utilisé me fait tiquer... je vais regarder ça.
    M. Lebowski : Avez-vous un emploi, monsieur ?
    Le Duc : Un emploi ?
    M. Lebowski : Ne me dites pas que vous cherchez un emploi dans cette tenue un jour de semaine ?
    Le Duc : Un jour de… Quel jour on est ?

  6. #6
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Re,

    Tout a fait d'accord avec vous mais parfois le rêglage de node deviens une casse tête pour ceux qui ne le conaisse pas

    brief j'ai trouver ce lien en faisant une recherche sur le sujet

    http://blog.servergrove.com/2012/03/16/error-cannot-find-module-less-with-symfony2-assetic-and-twitter-bootstrap/

    apparament il faut explicitement donner le path vers node et node_modules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    assetic:
       debug: %kernel.debug%
       use_controller: false
       filters:
         cssrewrite: ~
         less:
           node: /usr/local/bin/node
           node_paths: [/usr/local/lib/node_modules]
    un whereis node_modules sur mon locale donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    node_modules: /usr/local/lib/node_modules
    Je suis Développeur Senior ouvert aux opportunités
    Mon blog

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    t'as pas essayé de virer les sudo dans ta commande

  8. #8
    Membre confirmé
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Points : 516
    Points
    516
    Par défaut
    Citation Envoyé par goabonga Voir le message
    t'as pas essayé de virer les sudo dans ta commande
    Bah justement, c'est pas mal que tu en parles. Ma méthode pour installer node et npm est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    admin@server:~$ wget http://nodejs.org/dist/v0.10.30/node-v0.10.30-linux-x64.tar.gz
    admin@server:~$ sudo tar --strip-components 1 -xzvf node-v* -C /usr/local
    Ensuite, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo npm install less -g
    J'ai fais ces manips en passant par sudo ou en me logguant en root (je me suis dit c'est peut-être le sudo qui déconne, il n'était pas actif de base le sudo).
    Je précise que si je passe avec un utilisateur admin (donc pas su), le npm install less -g me dit : "Wow mon petit bonhomme : impossible d'écrire dans /usr/local/lin/node_modules, passe en super utilisateur !".

    Est-ce que il y a quelque chose à savoir sur l'installation de tout ce petit monde par rapport aux utilisateurs ?

    Pour finir, je précise que si je compile en ligne de commande un fichier less, j'ai pas de soucis particuliers et ça peu importe l'utilisateur.
    M. Lebowski : Avez-vous un emploi, monsieur ?
    Le Duc : Un emploi ?
    M. Lebowski : Ne me dites pas que vous cherchez un emploi dans cette tenue un jour de semaine ?
    Le Duc : Un jour de… Quel jour on est ?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Essaie de debugguer directement dans les Sources de Assetic

    vendor/krisswallsmith/assetic/src/Assetic/Filter/LessFilter.php
    aux alentours de la ligne 147, ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            $proc = $pb->getProcess();
     
            echo PHP_EOL,' PROCESS NODE LESS';
            print_r($proc->getCommandLine());
            print_r($proc->getWorkingDirectory());
            print_r($proc->getEnv());//on devrait retrouver ici à l'index NODE_PATH le chemin  défini dans app/config.yml
            print_r($proc->getOptions());
     
           $code = $proc->run();
    Il peut être interessant de voir également ce qui se passe dans :
    vendor/krisswallsmith/assetic/src/Assetic/Filter/BaseNodeFilter::createProcessBuilder

  10. #10
    Membre confirmé
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Points : 516
    Points
    516
    Par défaut
    Ostie de calice, j'ai trouvé !

    C'est tout con... deux jours à bloquer là-dessus... c'est pour ça que j'aime l'informatique !

    Je vais essayé d'être clair. J'ai plusieurs machines :

    1. Les machines
    - 1 machine locale sous windows 7
    - 1 machine local sous Mac OS X
    - 1 serveur sous Centos 7

    2. Capifony
    J'utilise Capifony pour déployer mon application. Capifony utilise un fichier "modèle" pour générer le fichier parameters.yml de l'application en production qui s'appelle parameters.yml.dist.

    3. Versionning
    Je n'inclut donc pas dans mon versionning parameters.yml car il contient des paramètres propres à la configuration de la machine. Par exemple, la config smtp change si on est sur un serveur de prod ou si on est sur une machine en locale. Sur le serveur de production on va par exemple configurer le serveur smtp sur le même serveur et sur le machine en locale utiliser son compte gmail.

    4. Les machines 2
    Pour utiliser node avec Smyfony2, il faut donner le path vers node dans config.yml. Sauf que sur Windows 7 c'st un path du type "C:\\...." et sur *NIX il faut "/usr/loca/...". Du coup, dans ma petite tête, je me suis dis, je remplace les valeurs de node et node_modules dans config.yml par des variables définies dans parameters.yml.

    C'est parti :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    # /path/to/project/symfony/app/config/parameters.yml.dist
        # Assetic
        use_assetic_controller: true
        ## *unix
        node: /usr/local/bin/node
        node_paths: [/usr/local/lib/node_modules/]
        ## Windows
        #node: C:\\Program Files\\nodejs\\node.exe
        #node_paths: C:\\Users\\__USERNAME__\\AppData\\Roaming\\npm\\node_modules
    et le fichier config.yml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # /path/to/project/symfony/app/config/config.yml
    # Assetic Configuration
    assetic:
        debug:          "%kernel.debug%"
        use_controller: false
        #bundles:        [ ]
        #java: /usr/bin/java
        filters:
            cssrewrite: ~
            less:
                node: "%node%"
                node_paths: "%node_paths%"
                apply_to: "\.less$"
    Comme vous pouvez le voir, je mets dans un coin le chemin vers node sur *NIX et sur Windows 7. Par défaut, c'est *NIX d'activé, mais si un développeur se rajoute, il sait en ouvrant ce fichier où trouver node.

    Capifony lorsqu'il déploie l'application, utilise ce fichier pour générer parameters.yml. Sauf que il me générait cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # /path/to/project/symfony/app/config/parameters.yml
        use_assetic_controller: true
        node: /usr/local/bin/node
        node_paths: 
            - /usr/local/lib/node_modules/
    Du coup, Symfony2 ne devait pas transformer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    # /path/to/project/symfony/app/config/parameters.yml
        node_paths: 
            - /usr/local/lib/node_modules/
    en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # /path/to/project/symfony/app/config/config.yml
       [...]
       node_paths: [/usr/local/lib/node_modules]
       [...]
    La bonne syntaxe est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # /path/to/project/symfony/app/config/parameters.yml.dist
        # Assetic
        use_assetic_controller: true
        ## *unix
        node: /usr/local/bin/node
        node_paths: /usr/local/lib/node_modules/   <= on enlève les crochets ici
        ## Windows
        #node: C:\\Program Files\\nodejs\\node.exe
        #node_paths: C:\\Users\\__USERNAME__\\AppData\\Roaming\\npm\\node_modules
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # /path/to/project/symfony/app/config/config.yml
    # Assetic Configuration
    assetic:
        debug:          "%kernel.debug%"
        use_controller: false
        #bundles:        [ ]
        #java: /usr/bin/java
        filters:
            cssrewrite: ~
            less:
                node: "%node%"
                node_paths: ["%node_paths%"]   <= on les rajoute ici
                apply_to: "\.less$"


    C'est comme ça qu'on apprend.

    Petite remarque :
    =====================
    Ce qui m'a induit en erreur, c'est :
    - que je n'avais pas d'erreur de syntaxe de levé sur le fichier config.yml.
    - je modifiais sur le serveur directement le fichier config.yml en remplaçant les variables par leurs valeurs (pour tester) mais ça ne changeait rien.

    J'ai remarqué que :
    1. En environnement de prod en tout cas, le fichier config.yml est aussi dans le cache car si je ne faisais pas cache:clear, mes modifications n'étaient pas prises en compte.
    2. peut-être que je m'y prend mal pour le multi-plateforme.

    Merci pour vos réponses et votre réactivité !
    M. Lebowski : Avez-vous un emploi, monsieur ?
    Le Duc : Un emploi ?
    M. Lebowski : Ne me dites pas que vous cherchez un emploi dans cette tenue un jour de semaine ?
    Le Duc : Un jour de… Quel jour on est ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Install libcurl pour PHP5 sous Debian Sarge
    Par evguen dans le forum Administration système
    Réponses: 3
    Dernier message: 21/03/2010, 21h47
  2. Installer la JRE pour Eclispe sous ubuntu
    Par Marie.B dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 21/07/2009, 19h46
  3. Réponses: 3
    Dernier message: 27/04/2009, 16h53
  4. installation de jboss pour eclipse sous windows
    Par polios dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 31/03/2009, 10h51
  5. Installation du module DBI pour perl sous W2K
    Par tomcat dans le forum Modules
    Réponses: 6
    Dernier message: 22/01/2004, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo