标签: itemgroup

清空MSBuild ItemGroup

有没有办法在不诉诸目标的情况下删除ItemGroup的内容?我正在寻找相当于的东西:

<ItemGroup>
  <MyItemGroup Remove="@(MyItemGroup)"/>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

谢谢

msbuild itemgroup

16
推荐指数
2
解决办法
5633
查看次数

将ItemGroup转换为分隔字符串

我的问题几乎与在MSBuild中创建一个字符串的ItemGroup相同,但是那里提供的解决方案似乎仍然存在现有的分隔符.这是我正在尝试做的简化片段:

<Target Name="Testing">
  <ItemGroup>
    <Files Include="$(RootDirectory)\*.*"/>
  </ItemGroup>

  <Message Text="@(Files->'%(Filename)%(Extension) ')"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

我想要的输出是这样的:

file1.cs file2.cs file3.cs
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码段会产生以下输出

file1.cs ;file2.cs ;file3.cs
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

msbuild transform itemgroup

15
推荐指数
1
解决办法
4110
查看次数

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万
查看次数

如何获取任何ItemGroup项的所有元数据键?

有没有办法获得与给定项目关联的所有元数据键?

我想做类似以下的事情.

鉴于:

  <ItemGroup>
    <MyItems Include="item1">
      <key1>val1</key1>
      <key2>val2</key2>
      <key3>val3</key3>
    </MyItems>
    <MyItems Include="item2">
      <key4>val4</key4>
    </MyItems>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

能够确定item1具有可用于key1,key2和key3的元数据,并且item2具有可用于key4的元数据,而不知道这些键的名称实际上是什么.

实际上,我正在尝试使用元数据来指定我不知道的属性,然后尝试找出一种方法来检查以查看已指定的属性.

换句话说,我相信每个项目的元数据只是一个包含键/值对的哈希,我试图找出所有键的内容.

任何人都知道如何使用msbuild做到这一点?

谢谢

msbuild msbuild-4.0 itemgroup

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

在不使用Exec或ItemGroup的情况下复制MSBuild中的单个文件

有没有办法做到这一点?我只需要复制一个文件,并认为Copy任务的SourceFiles参数可能有一些语法,这意味着你不需要事先定义一个ItemGroup,我宁愿坚持使用ItemGroup而不是使用Exec.

msbuild exec itemgroup

8
推荐指数
1
解决办法
7142
查看次数

MsBuild:使用CallTarget传递ItemGroup

我在我在MSBuild脚本中创建的项目组的范围方面遇到了一些问题.基本上,我想做的是有两个不同的目标-让我们称他们RunUnitTestsRunIntegrationTests-产生称为项目组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元数据

我想加入两个项目组:

  <ItemGroup>
<ServerTypeA Include="ServerA;ServerB;">
  <MetaDataA>A</MetaDataA>
</ServerTypeA>
</ItemGroup>

  <ItemGroup>
<ServerTypeB Include="ServerB;ServerC;">
  <MetaDataB>B</MetaDataB>
</ServerTypeB>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

使用常规联接将为我提供一个包含4个项目的集合:

ServerA with Metadata A;
ServerB with Metadata A;
ServerB with Metadata B;
ServerC with Metadata B;
Run Code Online (Sandbox Code Playgroud)

如何创建以下集合:

ServerA with Metadata A
ServerB with Metadata A & B
ServerC with Metadata B
Run Code Online (Sandbox Code Playgroud)

msbuild collections itemgroup

5
推荐指数
1
解决办法
3743
查看次数

如何在不执行构建的情况下检索@(TargetOutputs)

我正在实现一个MSBuild框架来驱动构建和部署作为层次结构组织的许多项目.

<Target Name="_CoreBuild">
  <MSBuild Projects="@(Project)" Targets="Build" Properties="Configuration=$(Configuration)">
    <Output TaskParameter="TargetOutputs" ItemName="CompiledAssemblies" />
  </MSBuild>
</Target>
Run Code Online (Sandbox Code Playgroud)

为了实现正确的Clean/Clobber逻辑,我想检索在使用当前选项执行构建时将编译的文件列表.

<Target Name="_CoreClobber" DependsOnTargets="_CoreClean">
   <!-- How to retrieve @(CompiledAssemblies) as if we were
        building @(Project) and retrieving the @(TargetOutputs) item group.
     -->
</Target>
Run Code Online (Sandbox Code Playgroud)

我已经尝试了各种方法,包括创建自定义任务,在其中我构建了一个自定义项目文件,用于导入我想从中检索属性/项目的原始项目.但这并没有给我可靠的价值.

有没有办法检索MSBuild项目的TargetOutputs项目组而不实际执行构建?

msbuild itemgroup

5
推荐指数
1
解决办法
2300
查看次数

MSBuild - 子目录中所有bin目录的ItemGroup

我的解决方案有多个项目(以及子目录),每个项目文件夹中都有一个"bin"文件夹.

我正在尝试在MSBuild脚本中创建一个包含所有这些目录的ItemGroup.

我认为这就足够了,但它不包含任何东西:

<ItemGroup>
  <BinDirs Include="**\bin" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

我不确定为什么这不起作用.任何人都可以指出我正确的方向来实现我想要做的事情吗?

问候,尼克

msbuild itemgroup

5
推荐指数
2
解决办法
6540
查看次数

MSBuild中的交叉连接项组

鉴于这样的事情......

 <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="test" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <ItemGroup>
            <ConfigFiles Include="*.config" />

            <DatabaseConfig Include="ABC">
                <Database>DB1</Database>
                <CsString>Database</CsString>
            </DatabaseConfig>

            <DatabaseConfig Include="DEF">
                <Database>DB2</Database>
                <CsString>Logging</CsString>
            </DatabaseConfig>
        </ItemGroup>


        <Target Name="test" >
            <!-- Some sort of join here (or somewhere)... -->
         <Message Text=" %(Combined.ConfigFile) %(Combined.Database) " />
        </Target> 
    </Project>
Run Code Online (Sandbox Code Playgroud)

我希望输出是这样的..(给出两个文件one.config和two.config)

one.config DB1
two.config DB1
one.config DB2
two.config DB2
Run Code Online (Sandbox Code Playgroud)

(顺序并不重要,只是两个ItemGroups的完整笛卡尔积)

msbuild itemgroup

5
推荐指数
1
解决办法
1736
查看次数

标签 统计

itemgroup ×10

msbuild ×10

collections ×1

exec ×1

msbuild-4.0 ×1

scope ×1

transform ×1