【问题标题】:How to set an Embedded Resource property with VS Build Configurations?如何使用 VS 构建配置设置嵌入式资源属性?
【发布时间】:2021-01-03 07:16:48
【问题描述】:

我正在使用 Visual Studio for Mac。

我发现了这个https://forums.xamarin.com/discussion/96777/how-to-set-info-plist-properties-with-vs-build-configurations,它描述了如何设置具有特定构建配置的辅助 plist 文件。哪个效果很好..

<None Include="Entitlements.plist" Condition="'$(Configuration)' != 'Debug-Staging'" />
<None Include="Entitlements-staging.plist" Condition="'$(Configuration)' == 'Debug-Staging'">
  <LogicalName>Entitlements.plist</LogicalName>
</None>

但是这种方法不适用于嵌入式资源...

<EmbeddedResource Include="ClientResources\myfolder\config.json" 
         Condition="'$(Configuration)' != 'Debug-Staging'" />
<EmbeddedResource Include="ClientResources\myfolder\config-staging.json" 
           Condition="'$(Configuration)' == 'Debug-Staging'">
    <LogicalName>config.json</LogicalName>
</EmbeddedResource>

我还尝试了具有完整路径的 LogicalName... 同样将条件放在 ItemGroup 上也无济于事。

编辑:

这是我创建的示例项目... https://github.com/JulesMoorhouse/ConfigBuildConfig/blob/master/ConfigBuildConfig/ConfigBuildConfig.csproj

如果选择了Debug-Staging 配置会发生什么,它应该读取config-staging.json 并在控制台中输出值。

这些消息来源表明这应该可行...

【问题讨论】:

  • 你是否将config.json文件Build Action设置为Embedded Resource
  • 感谢@LeoZhu-MSFT for config.json 是的...但我认为您的意思可能是 config-staging.json...可能不是...将尝试并报告??? ?
  • @LeoZhu-MSFT 没用......我想知道是不是名字,LogicalName 似乎没有填充在属性中,它是灰色的。虽然我可能错了,这就是问题所在。
  • @LeoZhu-MSFT 我已经添加了一个示例项目github.com/JulesMoorhouse/ConfigBuildConfig 也见上面的编辑
  • 你可以看看这个blog。希望对你有帮助。

标签: visual-studio xamarin visual-studio-mac


【解决方案1】:

这里似乎有两个主要问题。

  1. 您的 Debug-Staging 配置已映射到 Debug 配置。

这意味着该条件未用于 EmbeddedResource。

如果您在解决方案窗口中右键单击解决方案,然后选择选项,然后选择构建 - 配置、配置映射,您可以看到映射。

如果您在下拉列表中选择 Debug-Staging,您可以看到它在构建时映射到 Debug。

作为一个快速修复,我删除了 Debug-Staging 配置,重新添加它,确保检查所有解决方案项的创建配置,然后将 Debug-Staging 映射到仅为 .NET Standard CreateBuildConfig 项目的调试,留下其他项目改为使用 Debug。

完成此操作后,我在构建配置映射中得到了这个:

  1. Lo​​gicalName 会覆盖默认行为并成为嵌入资源的全名。

您的代码假设资源始终嵌入为:

  "ConfigBuildConfig.ClientResources.myfolder.config.json"

您可以更改两个 EmbeddedResources,使 LogicalName 为 config.json,因此无需指定完整路径。

或者,为了避免更改读取嵌入资源的代码,您可以修改 EmbeddedResource 的逻辑名称:

<EmbeddedResource Include="ClientResources\myfolder\config-staging.json" Condition="'$(Configuration)' == 'Debug-Staging'">
    <LogicalName>ConfigBuildConfig.ClientResources.myfolder.config.json</LogicalName>
</EmbeddedResource>

一旦修复了这两种东西,则数据线为环境显示“暂存”显示为配置时,并选择调试时的“制作”作为主工具栏中的配置。

为了让调试适用于 Debug-Staging 配置,我必须更新 .NET Standard 项目中的配置。 DebugType、DebugSymbols 是需要添加的两个 MSBuild 属性,但完整的更改如下所示:

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug-Staging|AnyCPU' ">
    <IntermediateOutputPath>obj\Debug-Staging</IntermediateOutputPath>
    <DebugType>portable</DebugType>
    <DebugSymbols>true</DebugSymbols>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug-Staging</OutputPath>
    <DefineConstants></DefineConstants>
    <NoWarn></NoWarn>
    <NoStdLib>false</NoStdLib>
  </PropertyGroup>

【讨论】:

  • 感谢马特,这几乎可以按预期工作。我已经致力于我的示例回购。但是断点不起作用。有什么遗漏吗?
  • 我必须从调试配置中复制一些调试值才能使断点工作。我会将其添加到答案中,因为在评论中添加 xml 不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2015-10-06
  • 2023-03-05
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2022-12-25
相关资源
最近更新 更多