相关疑难解决方法(0)

CreateItem vs ItemGroup

在目标中创建项目有什么区别,如下所示:

<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)

你何时会使用其中一个,为什么?

msbuild

32
推荐指数
3
解决办法
1万
查看次数

MSBuild ItemGroup包含/排除模式问题

问题:未根据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 itemgroup

9
推荐指数
1
解决办法
2万
查看次数

MsBuild:使用CallTarget传递ItemGroup

我在我在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)

msbuild scope itemgroup

6
推荐指数
1
解决办法
5499
查看次数

标签 统计

msbuild ×3

itemgroup ×2

scope ×1