有没有办法在不诉诸目标的情况下删除ItemGroup的内容?我正在寻找相当于的东西:
<ItemGroup>
<MyItemGroup Remove="@(MyItemGroup)"/>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
谢谢
我的问题几乎与在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)
我做错了什么?
问题:未根据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) 有没有办法获得与给定项目关联的所有元数据键?
我想做类似以下的事情.
鉴于:
<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做到这一点?
谢谢
有没有办法做到这一点?我只需要复制一个文件,并认为Copy任务的SourceFiles参数可能有一些语法,这意味着你不需要事先定义一个ItemGroup,我宁愿坚持使用ItemGroup而不是使用Exec.
我在我在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) 我想加入两个项目组:
<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框架来驱动构建和部署作为层次结构组织的许多项目.
<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项目组而不实际执行构建?
我的解决方案有多个项目(以及子目录),每个项目文件夹中都有一个"bin"文件夹.
我正在尝试在MSBuild脚本中创建一个包含所有这些目录的ItemGroup.
我认为这就足够了,但它不包含任何东西:
<ItemGroup>
<BinDirs Include="**\bin" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
我不确定为什么这不起作用.任何人都可以指出我正确的方向来实现我想要做的事情吗?
问候,尼克
鉴于这样的事情......
<?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的完整笛卡尔积)