2009-09-07 7 views
9

Ho riscontrato un problema con l'attività Attrib da MSBuild Community Tasks Project durante l'esecuzione su una macchina di compilazione a 64 bit.MSBuild.Community.Tasks.Attrib su macchina x64 non funzionante

Ho messo insieme questo piccolo progetto di prova per mostrare quale sia il problema:

<Project ToolsVersion="3.5" DefaultTargets="Build" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <Import Project="$(MSBuildExtensionsPath32)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 

    <Target Name="PrintProperties"> 
    <Message Text="MSBuildCommunityTasksPath: $(MSBuildCommunityTasksPath)"/> 
    <Message Text="MSBuildCommunityTasksLib: $(MSBuildCommunityTasksLib)"/> 
    <Message Text="MSBuildNodeCount: $(MSBuildNodeCount)"/> 
    <Message Text="MSBuildExtensionsPath: $(MSBuildExtensionsPath)"/> 
    <Message Text="MSBuildExtensionsPath32: $(MSBuildExtensionsPath32)"/> 
    <Message Text="MSBuildProjectDirectoryNoRoot: $(MSBuildProjectDirectoryNoRoot)"/> 
    <Message Text="MSBuildToolsPath: $(MSBuildToolsPath)"/> 
    <Message Text="MSBuildToolsVersion: $(MSBuildToolsVersion)"/> 
    <Message Text="MSBuildBinPath: $(MSBuildBinPath)"/> 
    <Message Text="MSBuildExtensionsPath: $(MSBuildExtensionsPath)"/> 
    <Message Text="MSBuildProjectDefaultTargets: $(MSBuildProjectDefaultTargets)"/> 
    <Message Text="MSBuildProjectDirectory: $(MSBuildProjectDirectory)"/> 
    <Message Text="MSBuildProjectExtension: $(MSBuildProjectExtension)"/> 
    <Message Text="MSBuildProjectFile: $(MSBuildProjectFile)"/> 
    <Message Text="MSBuildProjectFullPath: $(MSBuildProjectFullPath)"/> 
    <Message Text="MSBuildProjectName: $(MSBuildProjectName)"/> 
    <Message Text="MSBuildStartupDirectory: $(MSBuildStartupDirectory)"/> 
    </Target> 

    <Target Name="TestAttrib" DependsOnTargets="PrintProperties"> 
    <Attrib Files="Test.txt" ReadOnly="false" /> 
    </Target> 

</Project> 

quando tento di costruire questo progetto con MSBuild utilizzando TestAttrib come Target ottengo i seguenti risultati

C:> msbuild "C: _Source Code \ Test.vbproj"/t: TestAttrib Microsoft (R) Build Engine Versione 3.5.30729.1 [Microsoft .NET Framework, Versione 2.0.50727.4016] Copyright (C) Microsoft Corporation 2007. Tutti i diritti riservati.

Inizio lavori 7/09/2009 2:50:12 PM.
Progetto "C: _Source Code \ Test.vbproj" sul nodo 0 (TestAttrib target (s)).
MSBuildCommunityTasksLib: C: \ Program Files \ MSBuild \ MSBuildCommunityTasks \ MSBU ild.Community.Tasks.dll
MSBuildNodeCount: 1
MSBuildExtensionsPath: C: \ Program Files \ MSBuild
MSBuildExtensionsPath32: C: \ Program Files (x86) \ MSBuild
MSBuildProjectDirectoryNoRoot: Codice sorgente_
MSBuildToolsPath: C: \ Windows \ Microsoft.NET \ Framework64 \ v3.5
MSBuildToolsVersion: 3,5
MSBuildBinPath: C: \ Windows \ Microsoft.NET \ Framework64 \ v3.5
MSBuil dExtensionsPath: C: \ Program Files \ MSBuild
MSBuildProjectDefaultTargets: costruire
MSBuildProjectDirectory: C: Codice sorgente_
MSBuildProjectExtension: vbproj
MSBuildProjectFile: Test.vbproj
MSBuildProjectFullPath: C: Codice sorgente_ \ Test.vbproj
MSBuildProjectName : Test MSBuildStartupDirectory: C: \
C: _Source Code \ Test.vbproj (26,5): errore MSB4062: Impossibile caricare l'attività "MSBuild.Community.Tasks.Attrib" dall'assembly C: \ Program Files \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks.dll. Impossibile caricare il file o l'assembly 'file: /// C: \ Programmi \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks.dll' o una delle sue dipendenze. Il sistema non trova il file specificato. Confermare che la dichiarazione è corretta e che l'assembly e tutte le sue dipendenze sono disponibili. Progetto di costruzione completato "C: _Source Code \ Test.vbproj" (TestAttrib target (s)) - FAILED.

Build FALLITO.

"C: sorgente_ Codice \ Test.vbproj" (obiettivo TestAttrib) (1) -> (target TestAttrib) -> C: sorgente_ Codice \ Test.vbproj (26,5): l'errore MSB4062: Il "MSBuild. L'attività "Community.Tasks.Attrib" non può essere caricata dall'assieme C: \ Programmi \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks.dll. Impossibile caricare il file o l'assembly 'file: /// C: \ Programmi \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks.dll' o una delle sue dipendenze. Il sistema non trova il file specificato. Confermare che la dichiarazione è corretta e che l'assembly e tutte le sue dipendenze sono disponibili.

0 Warning(s) 
1 Error(s) 

Tempo trascorso 00:00:00.05

Perché MSBuild cerca l'attività Attrib in C: \ Programmi \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks.dll quando ho importato esplicitamente le attività utilizzando la variabile (MSBuildExtensionsPath32)?

risposta

7

mi sembra di aver risolto il problema modificando la linea 6 di "C: \ Program Files (x86) \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks.Targets"
In origine era:

<MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(MSBuildExtensionsPath)\MSBuildCommunityTasks</MSBuildCommunityTasksPath> 

e ho alterato a:

<MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(MSBuildExtensionsPath32)\MSBuildCommunityTasks</MSBuildCommunityTasksPath> 

nota il cambio di $ (MSBuildExtensionsPath) per $ (MSBuildExtensionsPath32)

Mentre questo se per avere risolto il problema per ora, non sono sicuro del motivo per cui ho dovuto modificare il file MSBuild.Community.Tasks.Targets in primo luogo - ho pensato che il programma di installazione si sarebbe assicurato che il file fosse corretto. Quindi forse modificare il file MSBuild.Community.Tasks.Targets non è la migliore idea del mondo, quindi fai attenzione se decidi di seguire il mio esempio.

+1

Aveva lo stesso identico problema, grazie! – PatrickJ

5

Questa è ovviamente una risposta troppo tardi, ma ho pensato di aggiungere a questo nel caso in cui qualcun altro stia avendo questo problema. Invece di modificare il file MSBuild.Community.Tasks.Targets, è sufficiente definire la proprietà MSBuildCommunityTasksPath in un gruppo di proprietà nel file di build. Per esempio, io ho qualcosa di simile nella parte superiore del mio script di build:

<PropertyGroup> 
    <ToolsDirectory>$(MSBuildProjectDirectory)\tools</ToolsDirectory> 
    <MSBuildCommunityTasksPath>$(ToolsDirectory)\MSBuildCommunityTasks</MSBuildCommunityTasksPath> 
</PropertyGroup> 

ho quindi memorizzare la cartella MSBuildCommunityTasks in una directory strumenti di controllo del codice sorgente. Significa che altre persone possono estrarre la fonte e costruirla immediatamente senza installare nulla.

Cheers, Adam