2009-05-17 10 views
9

Abbiamo una struttura di applicazioni Web che vogliamo utilizzare con Subversion. Abbiamo provato un paio di volte prima di configurarlo, ma la parte di generazione del codice della nostra applicazione sta causando problemi.Subversion - gestione della generazione di codice

Il problema è che il codice generato da uno sviluppatore può trovarsi in un file più recente rispetto a quello di un altro sviluppatore, ma il contenuto del file più recente può essere più vecchio, perché il codice e i file xml che sono la base per la generazione del codice è stato aggiornato dallo sviluppatore nr2.

Una soluzione che abbiamo esaminato è escludere i file generati dal codice, ma spesso riceviamo nuovi file che vengono generati e vengono automaticamente aggiunti al repository a meno che non ci ricordiamo di escluderlo e dobbiamo controllare manualmente negli ultimi file generati. E come fai a sapere se hai l'ultimo file generato?

Qualche suggerimento su come risolvere questo in Subversion?

risposta

24

Il modo migliore per decidere se qualcosa deve essere in Subversion è di ricordare che si tratta di un sistema di controllo versione . Se non è necessario ricordare come è cambiato nel tempo, non è necessario che sia in svn. Utilizzare svn:ignore per escludere file da tale considerazione.

Questo è il caso qui: non ti interessa come i file generati sono cambiati nel tempo, solo il codice originale utilizzato per produrli. Ciò significa che dovrebbero essere esclusi da Subversion. È possibile farlo con un aggancio pre-commit, applicando, ad esempio, che tutti i file generati dal codice non dovrebbero mai essere commessi. Ho una frase preferita per questa tattica: "Versione la ricetta, non la torta".

E come si fa a sapere se si dispone dell'ultimo file generato?

Esatto; non lo fai, perché i file generati dipendevano dalla fonte utilizzata per crearli. Il tuo prossimo passo è quello di assicurarti che il tuo processo di generazione generi automaticamente questi file dato il codice sorgente iniziale, ma probabilmente è una domanda StackOverflow separata se non sai già come farlo.

+4

+1. "Versione la ricetta, non la torta" - molto bella! –

4

È necessario utilizzare svn:ignore, perché in realtà non si desidera eseguire il commit delle cose generate automaticamente in sovversione.

+1

@krosenvold: non sono sicuro che sarei d'accordo. Se si desidera eseguire il rollback a un certo punto nel tempo, non avere i file generati in SCC rende le cose molto difficili. Ho sempre inserito il codice generato in SCC. –

+0

@Mitch, perché non puoi rigenerare i file dopo il rollback? –

+0

Suppongo dipenda da cosa li stai generando .... –

2

Forse sono semplice, ma non memorizzerei i file generati nel controllo di versione. Dal momento che è stato generato, non ha senso conservare una cronologia delle versioni.

Con il codice e xml per eseguire il controllo della versione in generazione è sempre possibile generare il codice per ogni versione.

10

Una soluzione abbiamo esaminato è quello di escludere il codice file generato

Sì! Mille volte sì! Non eseguire mai il controllo della versione di file che è possibile generare da altri file. Invece, aggiungi le regole di generazione al tuo makefile (o altro script di build).

vengono aggiunti automaticamente al repository

Ciò che è di aggiungerli automaticamente? Per quanto posso ricordare, ho sempre dovuto aggiungere i file manualmente. Se lo strumento che aggiunge automaticamente è sbagliato, allora forse la correzione di quello strumento è la giusta via da percorrere?

a meno che non ci ricordiamo di escluderlo

Avete strumento di generazione aggiunge un commento che dice "il file generato automaticamente da $ TOOL", e aggiungere un gancio Subversion che greps i file per quel commento e li respinge. Predisporre disposizioni adeguate per gli strumenti di generazione del codice; ad esempio: se il file contiene il commento "autogenerato", aggiungerlo comunque se ha anche "rifiuto di svn eccetto" in un commento sulla stessa linea/e.

E come fai a sapere se hai l'ultimo file generato?

Generandolo dall'ultima ricetta, che si trova nell'ultimo commit di subversion.

+0

+1. Usare grep per verificare automaticamente la presenza di autogenerazione è una buona idea. –

0

Un altro buon stratergy non è scrivere codice nei file generati. Tienili separati. Quindi non importa chi li genera, non importa.

Mantenere la logica fuori da un file generato.

+0

Non penso che l'autore stia parlando di ** modifica manuale del codice sorgente generato automaticamente **, che è qualcosa da evitare come la peste. –

0

Nome generato file qualcosa come "className.autoGenerated.cs" e aggiungi ricorsivo svn: ignora l'attributo con il nome del modello corrispondente "* .autoGenerated.cs".