2009-06-14 6 views
1

J'ai un processus où j'ai besoin d'automatiser le processus de génération des assemblages satellites. Plus précisément, il s'agit de WPF et de la combinaison des ressources Resx et BAML.Génération et compilation de fichiers .resources avec MsBuild

J'ai un script de construction qui fonctionne, mais il nécessite l'ajout manuel des fichiers .resources que je veux combiner avec les ressources BAML. IOW, je dois ajouter au script de construction chaque fois que j'ajoute une ressource .Resx. Pas cool!

Actuellement, je suis en cours d'exécution l'éditeur de liens d'assemblage manuellement et le script ressemble à ceci:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- Adds the build action 'LocBamlCsv' --> 
    <ItemGroup> 
    <AvailableItemName Include="LocBamlCsv" /> 
    </ItemGroup> 


    <Target Name="CreateSatelliteAssemblies" 
      DependsOnTargets="$(CreateSatelliteAssembliesDependsOn)"> 

    <!-- Locbaml needs the runtime assemblies in the intermediate dir --> 
    <Copy SourceFiles="$(ProjectDir)..\Tools\LocBaml.exe" 
      DestinationFolder="$(OutputPath)" /> 


    <!-- generate a .resources file for .csv merged output --> 
    <Exec Command="LocBaml /generate ..\..\$(IntermediateOutputPath)$(TargetName).g.$(UICulture).resources /trans:%(LocBamlCsv.FullPath) /out:../../$(IntermediateOutputPath) /cul:%(LocBamlCsv.Culture)" 
      WorkingDirectory="$(OutputPath)" 
      Outputs="$(OutputPath)%(LocBamlCsv.Culture)\$(TargetName).$(UICulture).dll" /> 

    <!-- Generate the resource assembly by merging all .resources files --> 
    <!-- NOTE: Explicitly add any resource files here --> 
    <Exec Command="al /template:$(TargetName).exe /culture:%(LocBamlCsv.Culture) /out:%(LocBamlCsv.Culture)\$(TargetName).resources.dll /embed:$(TargetName).g.%(LocBamlCsv.Culture).resources /embed:$(TargetName).Properties.Resources.%(LocBamlCsv.Culture).resources" 
      WorkingDirectory="$(InterMediateOutputPath)" 
      /> 


    </Target> 
</Project> 

Comme mentionné cela fonctionne. mais la dernière commande qui appelle al serait beaucoup plus facile à utiliser s'il y avait un moyen d'utiliser des caractères génériques (par exemple $ (TargetName). * s.% (LocBamlCsv.Culture) .resources

J'ai J'ai essayé un certain nombre de choses: utiliser le processus de construction semble se déclencher au mauvais moment et il finit par échouer à trouver des fichiers

+0

Vous pouvez toujours écrire un script qui scanne le répertoire * .res ou autre et génère le script de compilation. –

+0

Jeff des liens sur la façon de faire cela? Je ne suis pas à la hauteur sur msbuild et je ne suis pas sûr de savoir comment je peux obtenir les fichiers et les rediriger vers le chemin de l'éditeur de liens. L'autre problème est que la section ne fonctionne pas (même avec les noms de fichiers codés en dur - probablement parce que le timing dans le processus de construction où ces fichiers sont disponibles est faux) où la commande explicite le fait. –

+0

Désolé, non. C'est pourquoi c'est un commentaire au lieu d'une réponse. :) Mais vous savez, perl ou python et ajoutez simplement vos fichiers au script de construction au lieu de le faire à la main. –

Répondre

1

Je ne sais pas exactement quel est votre problème mais vous avez dit quelque chose qui me fait réfléchir. "L'utilisation du processus de construction se déclenche apparemment au mauvais moment et il finit par ne pas trouver les fichiers." De là, j'ai l'impression que vous essayez de créer un élément qui contient des fichiers générés pendant le processus de construction. est le cas alors vous devriez déclarer ceux-ci comme dynamique éléments, qui sont des éléments déclarés à l'intérieur d'une cible. Les éléments déclarés en dehors des cibles (static items) sont évalués avant que la cible ne commence à s'exécuter. Voir mon blog MSBuild: Property and Item Evaluation.

Sayed Ibrahim Hashimi

Mon livre: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Dites merci pour votre conseil. Cela a fini par me pointer dans la bonne direction même si ce n'était pas exactement le problème. Le problème est que je construis mon assembly de ressources dans le dossier intermédiaire et apparemment le processus de construction normal l'écraserait. Je change mon code pour écrire l'assemblage final directement dans le dossier satellite de sortie cible et cela fonctionne maintenant de manière fiable. Je ne sais pas pourquoi * ça * n'est pas écrasé, mais ça semble fonctionner. Va vérifier votre livre. Heureux de voir qu'il y en a un sur MsBuild - la dernière fois que j'ai regardé il n'y avait rien. –

Questions connexes