2011-01-20 11 views
16

Ho un progetto che stava costruendo bene in VS 2008, e poi abbiamo installato e iniziato a usare TFS Build, e poi ci siamo trasferiti in TFS 2010 Tutto andava ancora bene e si stava sviluppando correttamente (dopo aver implementato il nostro nuovo processo di build che rendeva tutto molto bello con un'inizializzazione di avvio con un solo clic da qualsiasi client Visual Studio 2010 remoto). Non è stato necessario installare Visual Studio su Build Agent. Sto cercando molto difficile (molto duro) di non installare Visual Studio sul di compilazione perché la mia comprensione è che non è necessario, e non siamo in licenza per l'installazione su una macchina non-sviluppo.Come costruire un progetto VS2010 MakeFile (vcxproj) con TFS Build (No VS 2010)

Ora ho provato ad aggiornare la soluzione a VS 2010, scegliendo ancora .NET 3.5 perché è un assembly destinato alle procedure CLR di SQL Server e SQL Server non supporta ancora .NET 4.0. Ma semplicemente non riesco a crearlo ulteriormente con TFS Build. Non riesco a ottenere un messaggio di errore coerente da TFS Build e da una riga di comando di MS Build, ma penso che abbia qualcosa a che fare con Microsoft.Cpp.Targets che non si trovano in C: \ Programmi \ MSBuild \ perché non ho installato Visual Studio. Ho installato Microsoft Windows SDK 7.1 in modo da poter eseguire gli strumenti .NET 4.0 SDK come svcutil per altri progetti .NET 4.0, ma nulla sembra installare ciò che questa build desidera. La build errore di TFS dà me è:

C: \ TFSBld [...] \ GenerateLanguage \ GenerateLanguage.vcxproj (46,3): l'errore MSB4019: il progetto importato "C: \ Microsoft.Cpp .Default.props "è stato non trovato. Confermare che il percorso nella dichiarazione è corretto, e che il file esiste sul disco.

E quando si fa clic su tale errore mi ci vuole a questa riga nel file vcxproj:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 

Tutto quello che ho davvero bisogno di fare in questo progetto è gestito resgen per generare file di risorse da resx e li compili in gruppi satellite. Io sto usando un accumulo makefile per fare questo, in esecuzione manualmente resgen (credo che fosse perché non riesco a trovare un modo per compilare assemblee satellitare come soluzione stand-alone in altro modo), e quindi compilare chi in una DLL (I non ricordo come funzionasse ora, ma penso che sia stato eseguito manualmente AL.exe per compilare file DLL da file di risorse). Quindi, in pratica, ho solo bisogno di eseguire le righe di comando per costruire questo progetto, e non riesco a trovare un modo ragionevole per farlo senza buttare giù l'intero progetto e modificare lo script di compilazione TFS per eseguire una serie di linee di comando hard-coded anziché. Deve esserci un modo migliore.

Sono stato a questo tutto il giorno, e ho provato a scrivere il mio file .target e le schede delle proprietà .xml per prendere il posto del file standard, ma è un modo sopra la mia testa. Ho provato semplicemente a eliminare le righe, ma MSBuild si lamenta che non esiste un obiettivo "Build". Ho provato ad aggiungere un dummy al file vcxproj, ma non sembra che abbia eseguito i passaggi pre- e post-build in cui è stato eseguito tutto il lavoro.

+0

Sembra che questa domanda abbia già avuto risposta qui: http://stackoverflow.com/questions/3043294/how-to-build-a-vs2010-c-project-on-a-buildserver Qual è il modo corretto per aggiornare/rimuovere questa domanda? – BlueMonkMN

risposta

15

Microsoft Windows SDK 7.1 ha diverse opzioni di installazione. Avendo controllato solo gli "Strumenti" di "Sviluppo .NET", apparentemente non è sufficiente creare progetti vcxproj, anche se non includono alcun codice C++ (solo passi pre e post-compilazione). Aggiungendo l'opzione "Compilatori Visual C++" e selezionando completamente la casella "Intellisense e assiemi di riferimento" si installano i file e le impostazioni necessarie. Non sono sicuro che entrambi siano necessari, ma quella combinazione ha funzionato per me.

2

ho messo a punto un po 'complessa, ma funzionale lavoro in giro che coinvolge i seguenti passaggi.

  1. copiare questi file da C: \ Program Files (x86) MSBuild \ Microsoft.Cpp \ v4.0 \ su un sistema in cui è installato VS2010 - li controlla in controllo del codice sorgente in modo che siano recuperati come parte del spazio di lavoro:
    • Microsoft.Build.CPPTasks.Common.dll
    • Microsoft.BuildSteps.targets
    • Microsoft.Cl.Common.puntelli
    • Microsoft.Cpp.Default.props
    • Microsoft.Cpp.props
    • Microsoft.Cpp.targets
    • Microsoft.CppBuild.targets
    • Microsoft.CppCommon.targets
    • Microsoft.Link. Common.props
    • Microsoft.MakeFile.targets
    • Piattaforme \ Win32 \ Microsoft.Cpp.Win32.default.props Piattaforma
    • s \ Win32 \ Microsoft.Cpp.Win32.props
    • Platfotms \ Win32 \ Microsoft.Cpp.Win32.targets
  2. Modificare il file vcxproj per fare riferimento al percorso relativo in cui lo spazio di lavoro mette questi file invece di $ (VCTargetsPath).
  3. Modificare le righe (in tutti questi file) per utilizzare l'attributo AssemblyFile = "Microsoft.Build.CPPTasks.Common.dll" invece di fare riferimento a questo utilizzando l'attributo AsssemblyName.
  4. Elimina "$ (VCTargetsPath) \" nei file nella radice della nuova posizione in modo che trovi i file di pari livello invece di provare a fare riferimento alla macro VCTargetsPath inesistente. Puoi trovare le istanze che hai perso cercando di eseguire una build da riga di comando con MSBuild sulla macchina senza VS 2010 e guardando i messaggi di errore.
  5. Analogamente, sostituire $ (VCTargetsPath) nei file di directory figlio con percorsi relativi.
  6. Alla fine del file Microsoft.Cpp.Win32.targets, commentare "< VCMessage Code =" MSB8008 ".../>" linea e il seguente relativo <Import>.
  7. Prova ed errore, eseguire la configurazione della riga di comando e vedere cos'altro avrei dimenticato di menzionare. Penso che fosse la maggior parte di esso.
1

Una migliore alternativa al BlueMonkMN è quello di aggiungere

<PropertyGroup> 
    <VCTargetsPath Condition="'$(VCTargetsPath)' == ''">[path_to_the_fileset_listed]</VCTargetsPath> 
</PropertyGroup> 

come livello 1 bambino vicino alla parte superiore della vcxproj.

Il percorso può includere una variabile di ambiente o qualche altro percorso noto contenente la variabile.

Ciò rende meno un'intrusione ed è più facile da ripristinare rispetto a cambiare molte linee.

+1

Non hai ancora bisogno di avere quei file Microsoft. * Da qualche parte sulla macchina? – BlueMonkMN

+0

Sì, i file devono essere da qualche parte, ma la posizione è altamente configurabile. Questo è molto utile se si desidera il pieno controllo dei file, tenerli registrati e non manomettere i file originali. – jesper

+0

Allora, dove prendi i file? Avere la posizione configurabile è inutile senza alcuni mezzi per ottenere i file in quelle posizioni. – BlueMonkMN

0

Un approccio ancora più semplice con l'aggiunta di una variabile di ambiente per VCTargetsPath:

  1. Individuare la cartella CPP MSBUILD fornita dal BlueMonkMN
    • esempioC:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120
  2. aprire le finestre variabili d'ambiente
    • Control Panel > System > Advanced Settings > Advanced > Environment Variables
  3. Aggiungere una nuova variabile utente con:
    • Nome: VCTargetsPath
    • Valore: [il tuo percorso di obiettivi MSBuild dal punto 1 ]
  4. Riavvia Visual Studio.
  5. Fatto. Il tuo progetto dovrebbe costruire ora.