在目标块外部使用MSBuild PropertyGroup

在目标块外部使用MSBuild PropertyGroup,msbuild,Msbuild,我有一个项目文件集合: <ItemGroup> <ApplicationToDeploy Include="Frontend.WebSite.csproj;11.WebServices.csproj;22.WebServices.csproj"/> <ApplicationToDeploy Include="33.WebServices.csproj;44.WebServices.csproj;Workflow55Svc.csproj"/&g

我有一个项目文件集合:

<ItemGroup>
  <ApplicationToDeploy
    Include="Frontend.WebSite.csproj;11.WebServices.csproj;22.WebServices.csproj"/>
  <ApplicationToDeploy
    Include="33.WebServices.csproj;44.WebServices.csproj;Workflow55Svc.csproj"/>
</ItemGroup>
但是我想在目标块之外初始化这个项目组。像这样:

<PropertyGroup>
  <Cfgs>@(ApplicationToDeploy->'%(RootDir)%(Directory)*.config')</Cfgs>
</PropertyGroup>

<ItemGroup>
  <InputConfigs Include="$(Cfgs)" />
</ItemGroup>

<Target Name="111">
  <Message Text="Cfgs: @(InputConfigs)"/>
</Target>
我不明白发生了什么事。是否有可能在目标块之外获得相同的结果

我不明白发生了什么事

此行为是以下因素的影响:

在构建的评估阶段:

  • 属性是按照它们的顺序定义和修改的 出现。执行属性函数。表单中的属性值 $(PropertyName)在表达式中展开。属性值 设置为展开表达式
  • 项目定义按其出现的顺序定义和修改。属性函数已在表达式中展开。元数据值设置为扩展表达式
  • 项目类型按其出现的顺序定义和修改。格式@(ItemType)中的项值将展开。项目转换也被展开。属性函数和值已在表达式中展开。项目列表和元数据值设置为扩展表达式
在生成的执行阶段:

  • 在目标中定义的属性和项目 按它们出现的顺序一起计算。财产 函数被执行,属性值在 表达。项目值和项目转换也将展开。 属性值、项类型值和元数据值设置为 扩展表达式。”
该链接上还有一个关键点:“(…)字符串扩展取决于构建阶段。”。

您正在使用属性“Cfgs”递归映射项目文件夹,并定义配置文件的通配符
(*.config)
。当您在目标内部定义“Cfgs”时,InputConfigs将接收Cfgs的扩展值(以分号分隔的文件夹字符串列表),只解析通配符。另一方面,当您在目标外部定义“Cfgs”时,InputConfigs将接收Cfgs的未扩展值(
@(ApplicationDeploy->'%(RootDir)%(Directory)*.cs'))
。当InputConfig展开它时,它会在文件夹的分号分隔字符串列表中显示,但不会解析通配符
(*.config)

是否有可能在目标区块外获得相同的结果

我认为InputConfigs应该总是接收扩展的目录列表。扩展是在构建的执行阶段进行的。在这个阶段,只有 对目标中定义的属性和项目进行评估。因此,我会将所有初始化保留在“初始化”目标块内。我不是说不可能在目标块外进行初始化,但出于上述原因,它似乎不符合逻辑。=]

希望这有帮助

Cfgs: C:\Sources\WebServices\11\WebServices\11.WebServices\Web.config;C:\Sources\WebServices\22\WebServices\22.WebServices\web.log4net.config;C:\Sources\WebServices\33\WebServices\33.WebServices\web.environment.config
<PropertyGroup>
  <Cfgs>@(ApplicationToDeploy->'%(RootDir)%(Directory)*.config')</Cfgs>
</PropertyGroup>

<ItemGroup>
  <InputConfigs Include="$(Cfgs)" />
</ItemGroup>

<Target Name="111">
  <Message Text="Cfgs: @(InputConfigs)"/>
</Target>
Cfgs: C:\Sources\WebServices\11\WebServices\11.WebServices\*.config;C:\Sources\WebServices\22\WebServices\22.WebServices\*.config;C:\Sources\WebServices\33\WebServices\33.WebServices\*.config