2010-02-20 9 views
5

Sto tentando di utilizzare Flex Compile Time Constants per includere la data e l'ora in cui è stato creato il file SWF (revisione del codice sorgente/timestamp come SVN: le parole chiave non sono sufficienti per le nostre esigenze, è necessario conoscere l'effettivo tempo di costruzione, non il tempo di commit).Costanti tempo di compilazione Flex - Timestamp

Ho provato utilizzando ActionScript (come la documentazione suggerisce che si dovrebbe essere in grado di):

-define+=COMPILE::Timestamp,"new Date()" 

Ma questo dà "L'inizializzatore per un valore di configurazione deve essere un momento della compilazione costante"

ho provato a farla scendere a shell e utilizzare il comando date (usando varie configurazioni singole e doppie virgolette), ad esempio:

-define+=COMPILE::Timestamp,`date +%Y%m%d%H%M%S` 

posso solo g per funzionare con stringhe semplici e semplici espressioni costanti (ad esempio, posso fare 4-2 e sarà 2 in fase di esecuzione. Ma non riesco a fargli fare qualcosa il cui valore non sarebbe esplicitamente conosciuto nel momento in cui dichiaro la definizione.

Qualcuno ha avuto fortuna con qualcosa di simile?

risposta

3

Ho avuto lo stesso problema e ha finito per using this blog post come punto di partenza. Ha funzionato davvero bene per me. Dovevo solo aggiornare alcuni bit della classe per flettere 4. Tirato fuori la data dal swf conforme.

+1

Il link che hai fornito mi ha portato a questo blog post: http: //www.i gorcosta.org/?p=220. Questo lo distilla ulteriormente e non introduce alcuna dipendenza aggiuntiva dalla libreria. Ti dà accesso al tempo di compilazione dal tuo runtime (non usando define, ma leggendolo da una classe vuota tramite 'LoaderInfo.getLoaderInfoByDefinition (emptyClass) .bytes' e analizzando questo usando un bytearray) – MightyE

+0

Brillante. Grazie MightyE. – mrjrdnthms

0

La chiave per il vostro problema è più probabile nella seguente dichiarazione da Adobe riferimento a tempo di compilazione costanti: La costante può essere un valore booleano, una stringa o numero, o un'espressione che può essere valutata in ActionScript in fase di compilazione .

Suppongo che il Timestamp non sia disponibile in fase di compilazione.

Tuttavia, si può provare a utilizzare una stringa invece (qualcosa di simile)

public function GetUnixTime():String{ 
var myDate:Date = new Date(); 
var unixTime:Number = Math.round(myDate.getTime()/1000); 
return unixTime.toString(); 
} 

Un altro pensiero è che si potrebbe ottenere le informazioni dal file compilato.

Spero che questo aiuti.

+0

Il "o un'espressione che può essere valutata in ActionScript in fase di compilazione" è ciò che mi ha dato speranza, ma anche lo scenario più semplice che ho potuto concepire ('-define + = COMPILE :: Timestamp," new Date() "') non funziona (nemmeno 'new Date(). toString()'). Ho provato a creare un metodo come il tuo, ma dà lo stesso errore di cui sopra, "L'inizializzatore per un valore di configurazione deve essere una costante di tempo di compilazione." – MightyE

+0

Oh, anche, il timestamp del disco è in grado di sconfiggere quello che stavo cercando di realizzare, che doveva essere il client Flex" solo sapere "la data/ora in cui è stato costruito (sono un po 'sorpresa che non ci siano costanti fornite di questo tipo). Per utilizzare il timestamp, avremmo bisogno di qualcosa sul lato server per leggere il timestamp e riportarlo indietro, il che lo rende dipendente dal fuso orario e dal tempo del server su cui è in esecuzione, alcuni server specifici software laterale, e in particolare in situazioni di errore (parte di ciò che vogliamo fare è includere il tempo di compilazione nei rapporti di errore), questo potrebbe non riuscire su di noi – MightyE

+0

FWIW, un po 'di background: questa è una libreria che sarà incorporata in altre applicazioni. Non possiamo necessariamente garantire che esegua un particolare runtime lato server, né necessariamente che sia in esecuzione in una pagina Web, app Air, app desktop, widget telefono, ecc. – MightyE

0

Dopo una lunga ricerca, ho concluso che questo semplicemente non è fattibile.

0

Se non si utilizza FlexBuilder per eseguire le build, è possibile farlo abbastanza facilmente.

Faccio qualcosa di simile a FlexMojos in Maven.

Nella sezione di configurazione rilevanti:

   <definesDeclaration> 
        <property><name>BUILD::buildVersion</name><value>"${project.version}"</value></property> 
        <property><name>BUILD::buildRevision</name><value>"${buildNumber}"</value></property> 
       <property><name>BUILD::buildTimestamp</name><value>"${timestamp}"</value></property> 
       </definesDeclaration> 

FlexBuilder praticamente schifo come un ambiente di sviluppo per motivi come quello che citare