Apo*_*ore 5 msbuild msbuild-task msbuild-4.0
问题应该是什么:
这是我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>
Run Code Online (Sandbox Code Playgroud)
消息已写入控制台,但文件未移动,怎么回事?
原始问题(您可以忽略):
我在csproj文件中包含了一个导入,以从另一个文件导入任务:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\ModuleCompilation.targets" />
Run Code Online (Sandbox Code Playgroud)
现在,这是我的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>
Run Code Online (Sandbox Code Playgroud)
生成或重建时,控制台中确实显示“ AfterBuild”消息,并且确实生成了所有文件,但是它们并没有从Debug文件夹移动到我想要的位置。
如果我重建projet,文件会被移动,我想是因为已经存在,但是我想先生成文件然后再移动,但我不想让它们已经存在!
我一定缺少真正明显的东西,你能帮我吗?
编辑:
好的,所以我进行了一些测试,并且可以正常工作:
<ConfigFilesToMove Include="bin\Debug\App.config"/>
Run Code Online (Sandbox Code Playgroud)
虽然这不是:
<ConfigFilesToMove Include="bin\Debug\*.config"/>
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么?
编辑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>
Run Code Online (Sandbox Code Playgroud)
这是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)
Run Code Online (Sandbox Code Playgroud)
因此,MSBuild会忽略每个包含通配符的值?
问题:
在运行任何Target之前,已解决了在Target之外创建的ItemGroup的问题,因此您无法定位Target将创建的文件
解决方案:
我将代码更改为:
<Target Name="AfterBuild">
<ItemGroup>
<ConfigFilesToMove Include="bin\$(Configuration)\*.config"/>
</ItemGroup>
<Message Text="Message for AfterBuild" />
<Move SourceFiles="@(ConfigFilesToMove)" DestinationFolder="bin\$(Configuration)\Configuration\" />
</Target>
Run Code Online (Sandbox Code Playgroud)
现在,我的文件被检测到,因为在创建文件后,ItemGroup已解析。
| 归档时间: |
|
| 查看次数: |
1428 次 |
| 最近记录: |