在目标中创建项目有什么区别,如下所示:
<Target Name="DoStuff">
<CreateItem Include="@(IntermediateAssembly)" >
<Output TaskParameter="Include" ItemName="FileWrites"/>
</CreateItem>
</Target>
Run Code Online (Sandbox Code Playgroud)
和这样:
<Target Name="DoStuff">
<ItemGroup>
<FileWrites Include="@(IntermediateAssembly)" />
</ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)
你何时会使用其中一个,为什么?
问题:未根据exclude属性中传递的值正确构建ItemGroups数组.
如果你运行这个脚本它会创建一些示例文件,然后尝试根据Include/Exclude属性创建一个名为TheFiles的数组,问题是当Exclude是硬编码以外的任何东西时,或者是一个非常简单的属性,它是错误的.
目标DynamicExcludeList错误地选择了这些文件:
.\ AFolder\test.cs;.\ AFolder\test.txt
目标
HardcodedExcludeList 正确选择这些文件:.\ AFolder\test.txt
任何帮助非常感谢,这让我疯了.
(注意它的msbuild v4)
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Run">
<Target Name="Run" >
<CallTarget Targets="CreateSampleFiles" />
<CallTarget Targets="DynamicExcludeList" />
<CallTarget Targets="HardcodedExcludeList" />
</Target>
<Target Name="CreateSampleFiles" >
<MakeDir Directories="AFolder" />
<WriteLinesToFile Lines="Test" File="AFolder\test.cs" Overwrite="true" />
<WriteLinesToFile Lines="Test" File="AFolder\test.txt" Overwrite="true" />
</Target>
<Target Name="DynamicExcludeList" >
<PropertyGroup>
<CommonFileExclusion>.\DIRECTORY_NAME_TOKEN\**\*.cs</CommonFileExclusion>
<FinalExcludes>$(CommonFileExclusion.Replace('DIRECTORY_NAME_TOKEN', 'AFolder'))</FinalExcludes>
</PropertyGroup>
<Message Text="FinalExcludes: $(FinalExcludes)" />
<ItemGroup>
<TheFiles
Include=".\AFolder\**\*;"
Exclude="$(FinalExcludes)"
/>
</ItemGroup>
<Message Text="TheFiles: @(TheFiles)" />
</Target>
<Target Name="HardcodedExcludeList" >
<PropertyGroup>
<FinalExcludes>.\AFolder\**\*.cs</FinalExcludes>
</PropertyGroup>
<Message Text="FinalExcludes: $(FinalExcludes)" />
<ItemGroup> …Run Code Online (Sandbox Code Playgroud) 我在我在MSBuild脚本中创建的项目组的范围方面遇到了一些问题.基本上,我想做的是有两个不同的目标-让我们称他们RunUnitTests和RunIntegrationTests-产生称为项目组TestAssemblies,然后调用RunTests,它使用TestAssemblies来确定哪些组件运行的测试.
单元测试和集成测试的两个不同目标都依赖于构建目标,并从那里获得具有所有已编译程序集的项目组,但由于RunTests目标将从不同的位置调用,因此它不能真正依赖于它们中的任何一个.因此,我需要以某种方式将项目组传递给常见的testrunner目标.但是,这似乎是不可能的,因为对目标中项目组的更改似乎只限于在该目标内工作.
我看过这些 帖子,但它们似乎只是证实了我的恐惧,并建议DependsOnTarget作为一种解决方法 - 这对我不起作用,因为我需要在不同的运行中从不同的地方获取物品.
这是我到目前为止:
<Target Name="RunAllTests" DependsOnTarget="BuildProject">
<!-- In here, items created in BuildProject are available. -->
<CallTarget Targets="RunUnitTests;RunIntegrationTests">
</Target>
<Target Name="RunUnitTests" DependsOnTarget="BuildProject">
<!-- In here, items created in BuildProject are available. -->
<!-- One of those is @(UnitTestAssemblies) -->
<CreateItem Include="@(UnitTestAssemblies)">
<Output TaskParameter="Include" ItemName="TestAssemblies" />
</CreateItem>
<CallTarget Targets="RunTests" />
</Target>
<!-- Then there's a similar target named RunIntegrationTests, which does …Run Code Online (Sandbox Code Playgroud)