gpt4 book ai didi

msbuild - 在目标 block 之外使用 MSBuild PropertyGroup

转载 作者:行者123 更新时间:2023-12-02 10:12:45 26 4
gpt4 key购买 nike

我有一个项目文件集合:

<ItemGroup>
<ApplicationToDeploy
Include="Frontend.WebSite.csproj;11.WebServices.csproj;22.WebServices.csproj"/>
<ApplicationToDeploy
Include="33.WebServices.csproj;44.WebServices.csproj;Workflow55Svc.csproj"/>
</ItemGroup>

我正在尝试获取这些项目的 .config 文件的集合:

<Target Name="111">
<PropertyGroup>
<Cfgs>@(ApplicationToDeploy->'%(RootDir)%(Directory)*.config')</Cfgs>
</PropertyGroup>

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

<Message Text="Cfgs: @(InputConfigs)"/>
</Target>

Target block 内一切正常(我看到Web.Configs、App.Configs、Log4net.Configs等的集合):

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

但我想在 Target block 之外初始化此 ItemGroup。像这样:

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

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

<Target Name="111">
<Message Text="Cfgs: @(InputConfigs)"/>
</Target>

当我在目标 block 之外执行此操作时,我得到:

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

我不明白发生了什么。在 Target block 之外是否有可能获得相同的结果?

最佳答案

I don't understand what's happens.

此行为是 MSBuild evaluation order 的影响:

在构建的评估阶段:

  • 属性按照其出现的顺序进行定义和修改出现。执行属性函数。表单中的属性值$(PropertyName) 在表达式内展开。属性(property)值(value)设置为扩展表达式。
  • 项目定义按照其出现的顺序进行定义和修改。属性函数已经在表达式中进行了扩展。元数据值设置为扩展表达式。
  • 项目类型按照其出现的顺序进行定义和修改。 @(ItemType) 形式的项目值已展开。元素转换也得到扩展。属性函数和值已在表达式内扩展。项目列表和元数据值设置为扩展表达式。

在构建的执行阶段:

  • 在目标内定义的属性和项目按照它们出现的顺序一起评估。属性(property)函数被执行并且属性值被扩展表达式。项目值和项目转换也得到扩展。属性值、项目类型值和元数据值设置为扩展的表达式。”

该链接上还有另一个关键点“(...)字符串扩展取决于构建阶段。”。

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

Is it possible to get the same result outside Target block?

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

希望这有帮助,

关于msbuild - 在目标 block 之外使用 MSBuild PropertyGroup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14020789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com