Что вопрос должен быть:Файлы в 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 игнорирует любое значение, которое содержит подстановочные знаки ?
Возможно, из-за порядка оценки; вы пытались помещать ItemGroup в цель, поэтому она оценивается при запуске цели (и когда файлы уже существуют)? – stijn
Благодарим вас за ответ @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