2015-08-06 3 views
2

Что вопрос должен быть:Файлы в ItemGroup не обнаружен AfterBuild Target

Вот содержание моего ModuleCompilation.targets файла:

<ItemGroup> 
    <ConfigFilesToMove Include="bin\$(Configuration)\*.config"/> 
</ItemGroup> 
<Target Name="AfterBuild"> 
    <Message Text="Message for AfterBuild" /> 
    <Move SourceFiles="@(ConfigFilesToMove)" DestinationFolder="bin\$(Configuration)\Configuration\" /> 
</Target> 

Послание написано на консоль, но файлы не двигаются, как получилось?

Оригинальный вопрос (вы можете проигнорировать):

Я включил импорт в мой файл csproj импортировать задачу из другого файла:

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

Теперь, здесь содержание моего ModuleCompilation.targets файл:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="14.0" DefaultTargets="AfterBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <BaseFiles Include="bin\$(Configuration)\Libraries\ModuleBase*"/> 
     <ConfigFilesToMove Include="bin\$(Configuration)\*.config"/> 
     <OtherFilesToMove Include="bin\$(Configuration)\*" Exclude="bin\$(Configuration)\$(MSBuildProjectName)*" /> 
    </ItemGroup> 
    <Target Name="AfterBuild"> 
     <Message Text="AfterBuild" /> 
     <Move SourceFiles="@(ConfigFilesToMove)" DestinationFolder="bin\$(Configuration)\Configuration\" /> 
     <Move SourceFiles="@(OtherFilesToMove)" DestinationFolder="bin\$(Configuration)\Libraries\" /> 
     <Message Text="bin\$(Configuration)\Libraries\ModuleBase*" /> 
     <Delete Files="@(BaseFiles)" /> 
    </Target> 
</Project> 

Когда я строить или перестраивать, у меня есть сообщение «AfterBuild» в моей консоли, и т файлы все действительно сгенерированы, но они не переместились из папки Debug туда, где я хочу, чтобы они были.

Если я перестраиваю свой проект, файлы перемещаются, я думаю, потому что там уже присутствовали, но я хочу, чтобы файлы были сгенерированы, а затем для перемещения, я не хочу, чтобы они уже присутствовали!

Должно быть, мне не хватает чего-то действительно очевидного, вы можете мне помочь?

Edit:

Ok, так что я сделал несколько тестов, и это работает:

<ConfigFilesToMove Include="bin\Debug\App.config"/> 

Хотя это не делает:

<ConfigFilesToMove Include="bin\Debug\*.config"/> 

Кто-нибудь knowns почему?

Edit 2: Это действительно странно, вот мой код:

<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <Files Include="$(OutputPath)*.config"/> 

     <Pouet Include="bin\Debug\*.dll"/> 
     </ItemGroup> 

     <Target Name="AfterBuild"> 
      <Message Text="@(Pouet)" /> 
      <Message Text="pouetss" Condition="Exists(@(Pouet))"/> 
      <Message Text="nooo" Condition="!Exists(@(Pouet))"/> 
      <MakeDir Directories="$(OutputPath)Configuration\" /> 
      <Copy SourceFiles="@(Pouet)" DestinationFolder="$(OutputPath)Configuration\" /> 
    </Target> 
</Project> 

Вот что бревно из MSBuild говорит:

1>Target "AfterBuild: (TargetId:75)" in file "C:\Tests\ModuleTest\Modules\ModuleCompilation.targets" from project   "C:\Tests\ModuleTest\Modules\FirstModule\FirstModule.csproj" (target "Build" depends on it): 
1>Task "Message" (TaskId:47) 
1>Done executing task "Message". (TaskId:47) 
1>Task "Message" skipped, due to false condition; (Exists(@(Pouet))) was evaluated as (Exists()). 
1>Task "Message" (TaskId:48) 
1> Task Parameter:Text=nooo (TaskId:48) 
1> nooo (TaskId:48) 
1>Done executing task "Message". (TaskId:48) 
1>Task "MakeDir" (TaskId:49) 
1> Task Parameter:Directories=bin\Debug\Configuration\ (TaskId:49) 
1> Creating directory "bin\Debug\Configuration\". (TaskId:49) 
1>Done executing task "MakeDir". (TaskId:49) 
1>Task "Copy" (TaskId:50) 
1> Task Parameter:DestinationFolder=bin\Debug\Configuration\ (TaskId:50) 
1>Done executing task "Copy". (TaskId:50) 
1>Done building target "AfterBuild" in project "FirstModule.csproj".: (TargetId:75) 

Так MSBuild игнорирует любое значение, которое содержит подстановочные знаки ?

+2

Возможно, из-за порядка оценки; вы пытались помещать ItemGroup в цель, поэтому она оценивается при запуске цели (и когда файлы уже существуют)? – stijn

+0

Благодарим вас за ответ @stijn. Благодаря вашему комментарию я нашел эту ссылку: http://blogs.msdn.com/b/msbuild/archive/2005/10/04/476725.aspx, в которой говорится, что я должен использовать задачу CreateItem внутри Target, потому что группы элементов за пределами Цели разрешаются до запуска целей. Кроме того, в MSDN указано, что задача CreateItem устарела и вместо этого я должен вместо этого разместить группу элементов в целевом элементе (https://msdn.microsoft.com/en-us/library/s2y3e43x), поэтому я предполагаю, что вы являются правильными. Я буду обновлять свой пост, как только у меня будет возможность попробовать нашу теорию. – Apollidore

ответ

2

Проблема:

ItemGroup создана за пределами Target будут решены до того, как Target запущен, так что вы не можете предназначаться файлы, что цель будет создавать

Решение:

Я изменил свой код на:

<Target Name="AfterBuild"> 
    <ItemGroup> 
     <ConfigFilesToMove Include="bin\$(Configuration)\*.config"/> 
    </ItemGroup> 
    <Message Text="Message for AfterBuild" /> 
    <Move SourceFiles="@(ConfigFilesToMove)" DestinationFolder="bin\$(Configuration)\Configuration\" /> 
</Target> 

И теперь мой файлы обнаруживаются, потому что ItemGroup разрешается после создания файлов.

+0

Это решение сработало для меня. Благодарю. –

Смежные вопросы