Cambio un objeto, especifico y genero y no veo los cambios al ejecutar.

Me han plateado varias veces este problema:

No veo los cambios cuando ejecuto. Hago cambios en los objetos, especifico y genero y cuando ejecuto sigo viendo la version vieja del programa. 

GeneXus usa el concepto de "main object".  Esto era mas facil de comprender en los ambientes WIN, pero en ambientes WEB es un poco mas difícil de entender. 

Voy a hablar de ejecutable como sinónimo de assembly (en .net) o de class (en java).

Los Transacciones y Webpanels generan un ejecutable (sean main o no sean main). 

Un Procedure, Data Provider, BC genera un ejecutable si es main, y se incluye en los ejecutables de los objetos que lo llaman.

Cuando se compila un objeto no main?. 

Se compila cuando se hace Run/Build del objeto main que lo invoque.

Que pasa cuando hago RUN de un main?

Cuando se hace el RUN de un objeto, primero se hace un BUILD del arbol de invocaciones de dicho main, con lo que se especifica todos los objetos cambiados en el arbol de llamadas y luego se compila y se ejecuta el ejecutable generado.

Que pasa cuando hago un F5?. 

Se hace un run del Startup Object, compilando todos los main alcanzables desde el.

Que es el Developer Menu?

Es un programa que genera Genexus en forma opcional, para poder compilar todos los objetos que no son llamados por nadie.

Porque me compila muchos  objetos cuando doy F5 (aunque tengo pocos cambios)? 

Posiblemente sea porque el Startup Object tiene un arbol de llamada que incluye muchos objetos, por ejemplo, si tengo una MasterPage que tiene un menu que llama a varios objetos del sistema.

Tengo un objeto que lo cambio, pero no veo los cambios en ejecucion. 

Posiblemente sea, porque no esta compilando el main que lo llama. Si no existe dicho main, puede ser necesario crear un main para que lo llame.
Para encontrar que main lo llama, hay que ver las References del objeto y revisar el arbol, hasta encontrar alguno que sea main (en KB grandes, no es una tarea facil).

Mi KB tiene call dinámicos, como puedo compilar estos objetos?

Conviene hacer un procedure que llame a todos los objetos que se llaman en forma dinamica y marcarlo como main. De esta forma va a ser facil compilarlos a todos

Recomendaciones para trabajar con KB grandes. 

Startup Object = un procedure que no haga nada.

Developer Menu = Tener deshabilitada la opción de generar el Developer Menu, pues demora muchisimo y da problemas de stack overflow al generar.

Expand Dynamic Call = Deshabilitado.

Tools/Options/Build
Conviene poner las opciones :
Build with this only = Forced
Call tree for build = Stop on main objects

Build With this Only de los objetos cambiados y luego hacer build o run de algun main que lo contenga.

Build all = Cada tanto, hacer un build all, para asegurarse que todo esta compilado. Si, ya se, demora mas de una hora, pero cada tanto hay que hacerlo igual.

Rebuild all = En mi caso, demora como 10 horas, por lo que es algo que dejo para las noches o fines de semana. No es algo que se necesite frecuentemente (por suerte).

Unreachables Objects = A partir de la Genexus 15, al especificar un objeto que no es alcanzable, da un warning. Esto puede ayudar a identificar objetos que no estan siendo incluidos en ningun main.


Este tema es cambiante y depende de la versión y generador que se este usando y no esta muy documentado, por lo que seguro que hay formas buenas de resolver estos problemas que aun no conozco.

Comentarios

  1. Solía haber (estoy hace un tiempo en la 9.0 ahora) un "build folder" que era un shortcut al "build with thEse" ya seleccionando los objetos de la folder. Teniendo organizados en folder (y pensando en módulos, también podría aplicar) los objetos, podría ayudar. Las opciones de spec/gen eran las mismas para el build with thEse que para el build with thIs.

    ResponderBorrar
  2. Hola Enrique, esto se puede generalizar para cuando uso una herramienta como Jenkins como lo estas manejando, ya que para el mismo caso un KB Grande, aquí se hace necesario estar enviando al GxServer esos procedimientos DUMMY que llama a los objetos que no son llamados por nadie? Ya que veo que Jenkins solo funciona si tiene el developer menu o es un tema de las tareas MSBUILD TASKS, como manejas este escenario?

    ResponderBorrar
  3. Yo no veo relacionado con Jenkins.
    En mi logica, todo objeto tiene que ser alcanzable desde un main.
    Si tengo calls dinamicos, hago un objeto main que los llame y compile.
    Con esas dos reglas sencillas, todo queda alcanzable y compilable.

    ResponderBorrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.