Msbuild 后期生成目标未检测到ItemGroup中的文件
问题应该是什么: 以下是我的Msbuild 后期生成目标未检测到ItemGroup中的文件,msbuild,msbuild-task,msbuild-4.0,Msbuild,Msbuild Task,Msbuild 4.0,问题应该是什么: 以下是我的模块编译.targets文件的内容: <ItemGroup> <ConfigFilesToMove Include="bin\$(Configuration)\*.config"/> </ItemGroup> <Target Name="AfterBuild"> <Message Text="Message for AfterBuild" /> <Move SourceFiles
模块编译.targets
文件的内容:
<ItemGroup>
<ConfigFilesToMove Include="bin\$(Configuration)\*.config"/>
</ItemGroup>
<Target Name="AfterBuild">
<Message Text="Message for AfterBuild" />
<Move SourceFiles="@(ConfigFilesToMove)" DestinationFolder="bin\$(Configuration)\Configuration\" />
</Target>
所以MSBuild会忽略所有包含通配符的值?问题: 在目标之外创建的ItemGroup将在运行任何目标之前解析,因此不能将目标将创建的文件作为目标 解决方案: 我将代码更改为:
<Target Name="AfterBuild">
<ItemGroup>
<ConfigFilesToMove Include="bin\$(Configuration)\*.config"/>
</ItemGroup>
<Message Text="Message for AfterBuild" />
<Move SourceFiles="@(ConfigFilesToMove)" DestinationFolder="bin\$(Configuration)\Configuration\" />
</Target>
现在检测到我的文件,因为项目组在创建文件后被解析。可能是由于评估顺序;您是否尝试将ItemGroup放入目标中,以便在目标运行时(以及文件已经存在时)对其进行评估?感谢您回答@stijn。多亏了你的评论,我找到了这个链接:上面说我应该在目标内部使用CreateItem任务,因为目标外部的项目组在目标运行之前会被解析。而且,MSDN说CreateItem任务已被弃用,我应该在目标元素()中放置一个项目组,所以我猜您是对的。一旦我有机会尝试我们的理论,我会尽快更新我的帖子。
<?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>
<ConfigFilesToMove Include="bin\Debug\App.config"/>
<ConfigFilesToMove Include="bin\Debug\*.config"/>
<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>
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)
<Target Name="AfterBuild">
<ItemGroup>
<ConfigFilesToMove Include="bin\$(Configuration)\*.config"/>
</ItemGroup>
<Message Text="Message for AfterBuild" />
<Move SourceFiles="@(ConfigFilesToMove)" DestinationFolder="bin\$(Configuration)\Configuration\" />
</Target>