videos resueltos probabilidad mutuamente independientes independencia excluyentes eventos ejercicios ejemplos dependientes delphi delphi-xe3

resueltos - Delphi XE3: problemas con eventos complejos previos a la construcción



probabilidad de eventos independientes youtube (2)

Actualmente estamos en el proceso de cambiar de Delphi XE a Delphi XE3, y estamos teniendo serios problemas con nuestros eventos previos a la construcción.

Nuestros eventos previos a la construcción se ven así:

SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc brcc32 -foProject.res VersionInfo.rc

(tenga en cuenta que estos dos comandos aparecen en líneas separadas y contienen las rutas absolutas en nuestros comandos "reales"), es decir, primero extraemos la versión SVN actual de la copia de trabajo, escribimos esta información en VersionInfo.rc y luego usamos el compilador de recursos Borland para generar un archivo de recursos.

Esto funcionó perfectamente en las versiones anteriores de Delphi, pero cada vez que abrimos las opciones del proyecto en XE3, XE3 lo convierte en:

SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc &brcc32 -foProject.res VersionInfo.rc

(tenga en cuenta que esta es una sola línea, ambos comandos separados por un solo signo). que hace que la construcción falle.

Nuestra solución actual es cambiar esto manualmente a

SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc && brcc32 -foProject.res VersionInfo.rc

es decir, usamos dos signos y signos para ejecutar el segundo comando si el primero tiene éxito.

Esto funciona, pero solo hasta que editemos las opciones del proyecto nuevamente: Delphi XE3 siempre arruina el evento de preconstrucción :-(

¿Alguien sabe una solución / solución para esto? Creo que podríamos escribir una herramienta de línea de comandos simple que llame a SubWCRev y brcc32, pero preferiría una solución más simple.

ACTUALIZACIÓN : pasos para reproducir fácilmente este error

IDE

  • Archivo -> Nuevo -> Aplicación de formularios VCL (Delphi)
  • Build Project1
  • Archivo -> Guardar todo, mantenga los nombres sugeridos Unit1.pas / Project1.dpr
  • Proyecto -> Opciones
  • elija el objetivo "Todas las configuraciones: todas las plataformas"
  • Build Events -> Pre-build events, ingresa esto (dos líneas, perdón por el formateo):

    echo one> out.txt

    echo two >> out.txt

  • Construye el proyecto desde el IDE

  • Guarde y cierre el proyecto

Indicador de comando de RAD Studio

  • Navega al directorio del proyecto
  • msbuild Project1.dproj => Aceptar

IDE

  • Proyecto -> Opciones
    • haga clic en "Ruta de búsqueda"
      • Entrar a"
      • eliminar la "a"
    • haga clic en Aceptar
  • Proyecto -> Proyecto de construcción
  • Guarde y cierre el proyecto

Indicador de comando de RAD Studio

  • msbuild Project1.dproj => ERROR

Terminamos usando una solución similar a la propuesta por David Heffernan:

  • combinar todas nuestras llamadas en un único script (Ruby) PreBuild.rb
  • compila este script de Ruby en un ejecutable independiente (ya que no todos los desarrolladores tienen instalado Ruby)
  • usar un solo evento previo a la construcción en Delphi

En caso de que alguien esté interesado, aquí está nuestro evento PreBuild:

PreBuild "<path_to_SVN_working_copy>" "VersionInfo.rc.in" $(OUTPUTNAME).res

y aquí está el script PreBuild.rb:

#!/usr/bin/env ruby require ''tempfile'' if ARGV.length < 3 puts "usage: #{$0} <path> <infile> <outfile>" exit 1 end # svnversion.exe is part of the SVN command line client svnversion = "svnversion.exe" path, infile, outfile = ARGV[0], ARGV[1], ARGV[2] # call svnversion executable, storing its output in rev rev_str = `#{svnversion} "#{path}"`.chop # extract the first number (get rid of M flag for modified source) rev = /^[0-9]+/.match(rev_str)[0] # get current date date = Time.new # remove old output file (ignore errors, e.g. if file didn''t exist) begin File.delete(outfile) rescue end input = File.new(infile, "r") tmpname = "VersionInfo.rc" tmp = File.new(tmpname, "w+") input.each do |line| # replace $WCREV$ with revision from svnversion call outline = line.gsub(//$WCREV/$/, rev) # replace $WCDATE$ with current date + time outline = outline.gsub(//$WCDATE/$/, date.to_s) # write modified line to output file tmp.puts(outline) end input.close tmp.close puts "SubWCRev: Revision: #{rev}, date: #{date}, written to #{tmpname}" call = "brcc32 -fo#{outfile} #{tmpname}" puts call system(call)


Estoy usando Delphi XE4, y tuve el mismo problema con casi los mismos comandos. Nuestro PreBuildEvent tiene 4 líneas, probé lo que aquí se describe, puse todo en 1 línea y separando mis comandos con &&, y funcionó. Luego traté de modificar para ver si XE4 arruinaría mi preconstrucción, pero después de volver a colocar mi preconstrucción en 4 líneas, todavía funcionaba.

Finalmente descubrí con otros proyectos en los que pude reproducir este error, que simplemente editando el script eliminando el CRLF al final de cada línea y volviéndolo a colocar, desde el entorno XE4, se corrigió el PreBuildEvent.