2017-04-27 3 views
0

J'ai un projet C# Un situé dans FolderA qui fait référence à un projet partagé B. Les fichiers du projet partagé se trouvent dans FolderB. Le projet partagé B contient un fichier C.gz avec les propriétésxbuild ne parvient pas à intégrer les ressources du projet partagé

Build ActionEmbedded Resource
Copy to Output DirectoryDo Not Copy

Lorsque je tente de construire des projets A l'aidexbuild (en particulier les versions 4.8 et 4.8.1, les architectures x86 et x64):

xbuild A.csproj 

Je reçois l'erreur de compilation suivante:

C:\Program Files (x86)\Mono\lib\mono\xbuild\14.0\bin\Microsoft.Common.targets (CopyNonResxEmbeddedResources target) ->

C:\Program Files (x86)\Mono\lib\mono\xbuild\14.0\bin\Microsoft.Common.targets: error : Cannot copy FolderA\C.gz to FolderA\obj\Release\C.gz, as the source file doesn't exist.

dire xbuild recherches pour le fichier de ressources intégré dans Foldera bien qu'il soit apparemment situé dans FolderB ainsi que les autres fichiers du projet partagé B.

Il n'est pas possible pour moi de déplacer le fichier de ressources incorporé vers le projet A, car le projet partagé est également référencé à partir de plusieurs autres projets.

Y at-il autre chose que je peux faire pour projet Un succès construire avec xbuild?


Side note: est-ce un comportement attendu dans xbuild, ou est-ce un bug? Avec msbuild Je n'ai pas ce problème.

Répondre

1

Ce problème semble être une faille dans l'implémentation xbuild actuelle, donc j'ai dû appliquer une solution de contournement spécifique à ce problème.

Depuis xbuild attend le fichier de ressources intégré soit disponible dans le dossier FolderA, ajouter simplement une étape de pré-construction dans le fichier de projet:

<ItemGroup> 
    <FilesToCopy Include="..\FolderB\C.gz" /> 
</ItemGroup> 
<Target Name="BeforeBuild"> 
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="."/> 
</Target> 

En option, on pourrait aussi envisager une nettoyage après la construction en supprimant le fichier copié dans le post-build.

Remarque! Pour veiller à ce que l'étape de pré-construction est correctement pris en compte, assurez-vous de placer après cette ligne:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />