¿cómo instalar texlive en una instancia de heroku? se hace con buildpacks

prefaso

conjeturas:

  • como uso LaTeX desde rails, debiera escribir sobre el buildpack de ruby o perderé el deploy
  • necesito hacer un binario de texlive que sea ejecutable por heroku
    para esto puedo compilarlo con vulcano (difícil) o encontrar un tarball de ubuntu (ojalá)

bin

Partiré por encontrar/hacer un binario de texlive para heroku.
Para ello, clonaré un buildpack de texlive puro como éste >>

$ git clone https://github.com/Numerico/heroku-buildpack-tex.git
$ cd heroku-buildpack-tex

dice que no funciona, veamos por qué.

Crearemos un proyecto en heroku con solo un archivo .tex adentro.

$ mkdir testapp
$ mv test.tex testapp/test.tex
$ cd testapp/
$ git init
$ git add .
$ git commit

$ heroku create --buildpack git://github.com/Numerico/heroku-buildpack-tex.git
Creating mighty-scrubland-7080... done, stack is cedar
BUILDPACK_URL=git://github.com/Numerico/heroku-buildpack-tex.git
http://mighty-scrubland-7080.herokuapp.com/ | git@heroku.com:mighty-scrubland-7080.git
Git remote heroku added

$ git push heroku master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 393 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
-----> Fetching custom git buildpack... done
-----> TeX Live app detected
-----> Fetching TeX Live 20121222
-----> Discovering process types
       Procfile declares types -> (none)
-----> Compiled slug size: 32.2MB
-----> Launching... done, v5
       http://mighty-scrubland-7080.herokuapp.com deployed to Heroku

To git@heroku.com:mighty-scrubland-7080.git
 * [new branch]      master -> master

Se vé bien, pero no sé si está funcionando…
Todo va bien hasta «Fetching TeX Live 20121222», de hecho me sorprende que lo baje, pues debiera necesitar la llave de S3 del autor.
En todo caso, como dice «Compiled slug size: 32.2MB» pareciera que sí lo baja. ¿Entonces lo que no estaría funcionando es que agarre el .tex y lo compile?
Porque además, el archivo bin/compile tiene la siguiente validación

if [ ! `which pdflatex` ]; then
build-warn "TeX Live installation failed"
exit 1
fi

que no estoy recibiendo… ¿cómo testearlo?

Con un Procfile >> que ejecute pdflatex

web:  yes "" | pdflatex test.tex

(le pongo tipo web para que no me lo cobren…)
Lo cual, según foreman >>, funciona

12:43:32 web.1  | Output written on test.pdf (1 page, 109090 bytes).

pero al parecer no en heroku

$ heroku ps
=== web: `yes "" | pdflatex test.tex`
web.1: crashed 2013/01/29 12:47:59 (~ 1m ago)

¿o será porque hace la pega y termina que queda crashed? ¡right! cacha

$ heroku logs
2013-01-29T15:50:54+00:00 app[web.1]: Output written on test.pdf (1 page, 896 bytes).

rubí

Ok entonces, como lo que quiero es instlar texlive para usarlo desde rails, lo que me falta es hacer esto mismo pero sobre el buildpack de ruby >>

$ git clone https://github.com/Numerico/heroku-buildpack-ruby

y… al final el buildpack luce así

#!/usr/bin/env ruby
system("aptitude search pdfinfo")

require 'net/https'
require 'open-uri'
require 'zlib'

# sync output
$stdout.sync = true

bdir=ARGV[0]
cdir=ARGV[1]
if not File.exists?(ARGV[0])
  Dir.mkdir(ARGV[0], 0777)
end
#
if not File.exists?(ARGV[1])
  Dir.mkdir(ARGV[1], 0777)
end
#
texlivehome=bdir+"/.texlive"
texlivecache=cdir+"/.texlive"
path=texlivehome+"/bin/x86_64-linux"
profiled=bdir+"/.profile.d/texlive.sh"
pdfinfohome=bdir+"/.pdfinfo"
pdfinfov="xpdfbin-linux-3.03.tar.gz"
# Prepare the various paths
if not File.exists?(texlivehome)
  Dir.mkdir(texlivehome, 0777)
end
if not File.exists?(texlivecache)
  Dir.mkdir(texlivecache, 0777)
end
if not File.exists?(File.dirname(profiled))
  Dir.mkdir(File.dirname(profiled), 0777)
end
if not File.exists?(pdfinfohome)
  Dir.mkdir(pdfinfohome, 0777)
end
#
texlivedomain="heroku-buildpack-tex.s3.amazonaws.com"
pdfinfodomain="www.numerica.cl"
#
http = Net::HTTP.new(texlivedomain, 443)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
#version=`curl #{texlivedomain}/VERSION -s`
File.open("#{texlivehome}/VERSION", 'w') {|f|
  http.get('/VERSION') do |str|
    f.write str
  end
}
version=File.read("#{texlivehome}/VERSION")
puts "TexLive v."+version
#
texliveurl="#{texlivedomain}/texlive-#{version}.tar.gz"
#
if File.exist?(texlivecache+"/VERSION") then
  oldversion=File.read("#{texlivecache}/VERSION")
  if version == oldversion then
    puts "Installing TeX Live #{version} from cache"
  end
  #cp -R $TEXLIVE_CACHE/* $TEXLIVE_HOME
  system "cp -R #{texlivecache}/* #{texlivehome}"
else
  if File.exist?(texlivecache+"/VERSION") then
    puts "Upgrading to TeX Live #{version}"
  else
    puts "Fetching TeX Live #{version}"
  end

  #curl $TEXLIVE_URL -s -o - | tar xzf - -C $TEXLIVE_HOME
  open("#{texlivehome}/tarball.tar", 'w') do |local_file|
    open("https://"+texliveurl) do |remote_file|
      local_file.write(Zlib::GzipReader.new(remote_file).read)
    end
  end
  #tar
  system "tar xf #{texlivehome}/tarball.tar -C #{texlivehome}"

  # Make sure the cache is empty
  #rm -rf $TEXLIVE_CACHE/* 
  system "rm -rf #{texlivecache}/*"

  # Store a copy of it in the cache so it doesn't have to be fetched again
  #cp -R $TEXLIVE_HOME/* $TEXLIVE_CACHE
  system "cp -R #{texlivehome}/* #{texlivecache}"

  # Store the version for later
  #echo $VERSION > $TEXLIVE_CACHE/VERSION
  File.open(texlivecache+"/VERSION", 'w') {|f| f.write(version) }
end

#pdfinfo
if not File.exist?(pdfinfohome+"/"+pdfinfov)
  http = Net::HTTP.new(pdfinfodomain, 80)
  File.open("#{pdfinfohome}/#{pdfinfov}", 'w') {|f|
    http.get("/#{pdfinfov}") do |str|
      f.write str
    end
  }
end
system "tar xzf #{pdfinfohome}/#{pdfinfov} -C #{pdfinfohome}"

# Set up the environment for runtimes now that compilation has finished
#echo 'export PATH=$HOME/.texlive/bin/x86_64-linux:$PATH' >> $PROFILE_D
#system "echo 'export PATH=$HOME/.texlive/bin/x86_64-linux:$PATH' >> #{profiled}"
`echo '#!/bin/sh' >> #{profiled}`
`echo 'PATH="$HOME/.texlive/bin/x86_64-linux:$PATH"' >> #{profiled}`
`echo 'PATH="$HOME/.pdfinfo/xpdfbin-linux-3.03/bin64:$PATH"' >> #{profiled}`
#puts File.read("#{profiled}")
#`export PATH=#{path}:$PATH`

# `which pdflatex`
# if !$?.success? then
  # puts "pdflatex NOT INSTALLED"
# end  

##########################

$:.unshift File.expand_path("../../lib", __FILE__)
require "language_pack"

if pack = LanguagePack.detect(ARGV[0], ARGV[1])
  pack.log("compile") do
    pack.compile
  end
end

Todo lo que está sobre los ###### es la instalación de los binarios de TeXLive y xpdf. El código está funcional al día de hoy, pero como Heroku al final no me sirve por su sistema de archívos efímero, que me impide trabajar con ficheros, no lo mejoraré ni mantendré. Aquí está el link >>

El sitio utiliza cookies, para iniciar sesión o para cotizar los servicios. No usamos cookies de terceros.    Leer más
Privacidad