web-dev-qa-db-fra.com

Comment puis-je exécuter Ruby fichiers modèles (ERB) sans serveur Web à partir de la ligne de commande?

J'ai besoin de ERB (système de modèle de Ruby) pour le modèle de fichiers non HTML.
(Au lieu de cela, je veux l'utiliser pour des fichiers source tels que .Java, .cs, ...)

Comment puis-je "exécuter" Ruby modèles à partir de la ligne de commande?

37

Vous devriez avoir tout ce dont vous avez besoin dans votre répertoire Ruby/bin. Sur mon (WinXP, Ruby 1.8.6) système, j'ai Ruby/bin/erb.bat

erb.bat [switches] [inputfile]
  -x               print Ruby script
  -n               print Ruby script with line number
  -v               enable verbose mode
  -d               set $DEBUG to true
  -r [library]     load a library
  -K [kcode]       specify KANJI code-set
  -S [safe_level]  set $SAFE (0..4)
  -T [trim_mode]   specify trim_mode (0..2, -)
  -P               ignore lines which start with "%"

donc erb your_erb_file.erb devrait écrire le résultat dans STDOUT.

(EDIT: windows a erb.bat et simplement "erb". Le fichier .bat est juste un wrapper pour erb, ce qui, je suppose, devrait faire fonctionner la même commande à peu près la même sur n'importe quel OS)

Voir la discussion prag prog book (commence environ au milieu de la page).

Notez également que Jack Herrington a écrit n livre entier sur la génération de code qui utilise Ruby/ERB.

25
Mike Woodhouse

Écrivez un script Ruby qui le fait. La documentation de l'API est ici: http://www.Ruby-doc.org/stdlib/libdoc/erb/rdoc/

Par exemple:

template = ERB.new File.read("path/to/template.erb"), nil, "%"
template.result(binding)

(Où liaison est une liaison avec les @vars dont le modèle a besoin.)

24
Sam

Une autre option serait d'utiliser Ruby -e, puisque ERB itslef est si simple.

Quelque chose comme:

Ruby -rerb -e "puts ERB.new(File.read(<file name here>)).result"

Cependant, je suppose que vous avez un contexte dans lequel vous souhaitez rendre le modèle. Comment espérez-vous obtenir ce contexte? À titre d'exemple, consultez:

Ruby -rerb -e "hello = 'hello'; puts ERB.new('<%= hello %> world').result(binding)"

qui affichera "hello world", en utilisant le niveau supérieur, où vous avez défini la variable hello, comme liaison.

14
Yehuda Katz

Si vous pouvez basculer ERB vers Erubis, votre résolution de problèmes est aussi simple que:

require 'erubis'
template = File.read("sample_file.erb")
template = Erubis::Eruby.new(template)
template.result(:your_variable => "sample")
13
morgoth

J'ai trouvé cette question en essayant de tester mes modèles Puppet.

Terminé avec cette solution:

  1. Le long de votre foo.erb créer un fichier foo.vars.erb
  2. Mettez toutes vos variables de modèle dans ce nouveau fichier, par exemple:

    <% @my_param="foo bar" %>
    <% @another_param=123 %>
    

    ou équivalent):

    <%
    @my_param="foo bar"
    @another_param=123
    %>
    
  3. Sur la ligne de commande, exécutez ceci:

    cat foo.vars.erb foo.erb | erb
    

Votre modèle entièrement rendu devrait maintenant être imprimé en sortie standard. De là, vous vérifiez la sortie à la main, ou vous pouvez prendre diff (ou d'autres outils) pour la comparer à une sortie pré-rendue.

4
Hubert Grzeskowiak
1
Ninad

J'ai essayé de commenter cela, mais le lien de commentaires n'est pas disponible.

J'utilise ceci:

template = ERB.new File.new("path/to/template.erb").read, nil, "%"
template.result(binding)

De la publication ci-dessus: et j'ai trouvé ce que je pense que cela pourrait être un problème:

Je crée des fichiers DOS BATCH comme:

%Java_HOME%\bin\jar -xvf <%=inputfile%>...

Et j'ai trouvé un problème de chose étrange - je l'obtiens lorsque je lance avec le code ci-dessus:

Processing Template test.txt
erb):2:in `render': compile error (SyntaxError)
erb):2: syntax error, unexpected tSTRING_BEG, expecting $end
erbout.concat "\n"
               ^
       from DBUser.rb:49:in `render'
       from DBUser.rb:43:in `each'
       from DBUser.rb:43:in `render'
       from DBUser.rb:81

J'ai essayé ce qui suit, et j'ai contourné mon problème particulier - je ne sais pas si c'est la bonne réponse pour tout le monde ...

template = ERB.new File.new("path/to/template.erb").read
template.result(binding)
0
monojohnny