Tarea para Rake: Ruby on Rails en Aptana

Aptana es un IDE basado en Eclipse, el proyecto RadRails que pretende facilitar el desarrollo de aplicaciones con Ruby on Rails desde Eclipse se encuentra ahora dentro Aptana. Un problema típico puede ser que ya tenías tu proyecto empezado e intentas usarlo desde Aptana. Según cómo hayas creado tu aplicación puede llegar a traducirse a un cuelgue de Aptana debido a que no detecta bien el bucle infinito de enlaces simbólicos que se crea dentro del subdirectorio vendor cuando se crea la aplicación con un típico rails [nombre de la aplicación] (al menos si has usado los paquetes de ubuntu, incorrecta forma de instalar rails, por cierto).

Historias y rayadas aparte, si quieres importar tu proyecto de ruby on rails a Aptana/Eclipse, algo así como el típico mvn eclipse:eclipse de maven en el mundo Java, he hecho una tarea para rake, para realizar este proceso. Creará los ficheros necesarios para poder importar luego el proyecto desde Aptana, y eliminará los enlaces simbólicos malignos que he comentado en el anterior parrafo en caso de que existiesen.

Simplemente descargamos el fichero y lo colocamos en lib/tasks, y ejecutamos rake aptana:aptana. Esto nos creará en el raíz de nuestro proyecto dos ficheros, .loadpath y .project, que harán que nuestro proyecto pueda ser importado en Aptana (File, import, Existing projects…, y tal).

namespace :aptana do
  RAILS_APPDIR = RAILS_ROOT.sub("/config/..","")
 
  LIBS = %w{rails activerecord actionmailer actionpack 
            actionwebservice activesupport}
 
  def project_name
    Pathname.new(RAILS_APPDIR).basename.to_s
  end
 
  def project_file(name)
    <<END
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
  <name>#{name}</name>
  <comment>Project #{name} with ruby on rails</comment>
  <projects>
  </projects>
  <buildSpec>
    <buildCommand>
      <name>org.rubypeople.rdt.core.rubybuilder</name>
      <arguments>
      </arguments>
    </buildCommand>
  </buildSpec>
  <natures>
    <nature>org.rubypeople.rdt.core.rubynature</nature>
    <nature>org.radrails.rails.core.railsnature</nature>
  </natures>
</projectDescription>
END
  end
 
  def loadpath_file(excludes, libs)
    content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<loadpath>\n"
    content << "\t<pathentry "
    content << "excluding=\"" << excludes.join('|') << '" '
    content << 'path="" type="src"/>'
    content << "\n\t"
    content << '<pathentry path="org.rubypeople.rdt.launching.RUBY_CONTAINER" type="con" />'
    content << "\n"
    pathentry = proc {|l| "\t<pathentry path=\"GEM_LIB/#{l}/lib\" type=\"var\"/>\n"}
    libs.each {|lib| content << pathentry.call(lib)}
    content << '</loadpath>'
  end
 
  task :aptana => :environment do
    FileUtils.chdir(RAILS_APPDIR)
    File.open(".loadpath", 'w+') do |f|      
      FileUtils.cd(Gem.path[0]); FileUtils.cd('gems')
      gems = Pathname.new('.')
      includes = []
      LIBS.each do |lib|
        gems.entries.each {|e|
          includes << File.basename(e) if File.basename(e).index(lib) == 0 
        }
      end
      FileUtils.cd(RAILS_APPDIR); FileUtils.cd('vendor')
      vendors = Pathname.new('.')
      excludes = []
      for e in vendors.entries
        name = File.basename(e)
        if e.symlink? and name.index('rails') == 0
          FileUtils.rm(e)
        else
          unless name.index('plugin') == 0 || name.index('.') == 0
            excludes << 'vendor' + File::SEPARATOR + name
          end
        end
      end
      f.write loadpath_file(excludes, includes)
    end
    FileUtils.chdir(RAILS_APPDIR)
    File.open(".project", 'w+') do |f|
      f.write project_file(project_name)
    end
  end
end

Comments are closed.

Post Navigation