Domanda

Vogliamo archiviare i nostri target di build sovrascritti in un file esterno e includere il file di target in TFSBuild.proj.Abbiamo una serie di passaggi principali che si verificano e vorremmo ottenere questi passaggi aggiuntivi semplicemente aggiungendo la riga di importazione al file TFSBuild.proj creato dalla procedura guidata.

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/>

Non possiamo importare alcun file nel formato $(SolutionRoot) perché al momento della convalida dell'istruzione Import, l'origine non è stata recuperata dal repository.Sembra che TFS stia abbattendo il file TFSBuild.proj prima senza altri file.

Anche se aggiungiamo un'importazione condizionale, la versione nel controllo del codice sorgente non verrà importata, se presente.Verrà importata la versione precedente, già presente su disco.

Possiamo rinunciare a memorizzare tali obiettivi di compilazione con il nostro sorgente, ma è la prima dipendenza a uscire dal nostro albero dei sorgenti, quindi siamo riluttanti a farlo.

C'è un modo per:

  1. Di' a Team Build di estrarre qualche altro file, quindi quelli Import le dichiarazioni valutano correttamente?
  2. Sostituisci gli obiettivi di Team Build come AfterCompile in un modo oltre a Import?
  3. Alla fine, esegui obiettivi di build in Team Build mantenuti nella fonte che sta tentando di creare?
È stato utile?

Soluzione

Team Build ha una fase di "bootstrap" in cui tutto nella cartella Configurazione di Team Build (la cartella con TFSBuild.proj) viene scaricato dal controllo della versione.Questa operazione viene eseguita dall'agente di compilazione prima che l'agente di compilazione chiami MSBuild.exe dicendogli di eseguire TFSBuild.proj.

Se sposti il ​​file di destinazione da SolutionRoot e lo inserisci nella cartella di configurazione insieme al file TFSBuild.proj, sarai quindi in grado di importarlo nel tuo file TFSBuild.proj utilizzando un'istruzione di importazione relativa, ad es.

<Import Project="myTeamBuild.targets"/>

Se queste destinazioni si basano su eventuali assembly di attività MSBuild personalizzati aggiuntivi, puoi anche averli nella stessa cartella del file TFSBuild.proj e puoi farvi riferimento facilmente utilizzando un percorso relativo.

Tieni presente che in TFS2008, la cartella di configurazione della build si trova per impostazione predefinita in $/TeamProject/TeamBuildTypes, tuttavia non è necessario che sia lì.Può effettivamente risiedere in una cartella all'interno della tua soluzione e può anche essere un progetto nella tua soluzione dedicato a Team Build.Ciò presenta diversi vantaggi, tra cui rendere più semplice la ramificazione della build.Pertanto in genere la mia build si trova in una cartella come questa:

$/TeamProject/main/MySolution/TeamBuild

Tieni inoltre presente che per impostazione predefinita, durante la fase di bootstrap della build, l'agente di build scaricherà solo i file che si trovano nella cartella di configurazione della build e non si ricorsiverà in nessuna sottocartella.Se si desidera includere i file nelle sottocartelle durante la fase di bootstrap, è possibile impostare la seguente proprietà in appSettings del file tfsbuildserver.exe.config sui computer dell'agente di compilazione (situato in %ProgramFiles%\Visual Studio 9.0\Common7\IDE \PrivateAssemblies)

<add key="ConfigurationFolderRecursionType" value="Full" />

Tieni presente che se avessi più agenti di compilazione dovresti ricordarti di impostare questa impostazione su tutte le macchine e ciò influenzerebbe ogni compilazione eseguita da quell'agente di compilazione, quindi in realtà è meglio mantenere i file nella radice del crea la cartella di configurazione se puoi.

Buona fortuna,

Martino.

Altri suggerimenti

Se le destinazioni devono essere eseguite solo quando TFS esegue la build e non sui computer di sviluppo locali, puoi inserire il file delle destinazioni nella cartella della build stessa e farvi riferimento con:

<Import Project="$(MSBuildProjectDirectory)\my.team.build.targets.proj" />

Tuttavia, se desideri che le destinazioni vengano eseguite per tutte le build, puoi configurarle in modo che i singoli progetti vi facciano riferimento aggiungendo qualcosa come:

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets" Condition="Exists('$(SolutionRoot)/libs/my.team.build/my.team.build.targets')" />

Nel mio progetto in realtà li utilizziamo entrambi, il primo ci consente di personalizzare le build notturne in modo da poter eseguire passaggi aggiuntivi prima e dopo l'esecuzione della compilazione completa della soluzione, e il secondo consente la personalizzazione progetto per progetto.

Se crei un file di destinazione delle sostituzioni da importare e lo chiami qualcosa come TeamBuildOverrides.targets e lo inserisci nella stessa cartella nel controllo del codice sorgente in cui risiede TFSBuild.proj per il tuo tipo di build, verrà estratto per primo e sarà disponibile per l'importazione in TFSBuild file .proj.Per impostazione predefinita, il file TFSBuild.proj viene aggiunto alla cartella TeamBuildTypes nel controllo del codice sorgente direttamente nella cartella radice del progetto.

utilizza la seguente istruzione di importazione nel file TFSBuild.proj:

<Import Project="$(MSBuildProjectDirectory)\TeamBuildOverrides.targets" />

Assicurati di non avere sostituzioni duplicate nel file TFSBuild.proj altrimenti le sostituzioni importate non verranno attivate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top