Xamarin 形式;条件编译符号在 MSBUILD 命令行中不起作用

Posted

技术标签:

【中文标题】Xamarin 形式;条件编译符号在 MSBUILD 命令行中不起作用【英文标题】:Xamarin forms; Conditional Compilation Symbol not working from MSBUILD command line 【发布时间】:2021-12-23 14:00:05 【问题描述】:

我有一个适用于 iosandroid 的 Xamarin Forms 项目。该解决方案有四种配置,Test - Debug、Test - Release、Production - Debug、Production - Release。

共享 (PCL) 项目具有两个测试配置 TEST 的条件编译符号。生产配置和 PROD 相同

当我通过调试器从 Visual Studio 执行时,发生在 PCL 的启动函数 (App.cs) 中的条件编译在所有四种配置中都按预期工作:

#if TEST
            CurrentAppFlavor = Flavor.Test;
#else
            CurrentAppFlavor = Flavor.Production;
#endif

但是;当我通过 Azure Devops Pipelines 构建同一个项目时,尽管在 msbuild 中选择了正确的构建配置(并且日志证实了这一点),但打包的构建执行就像条件编译符号不存在一样(因此默认为生产。)

    inputs:
      projectFile: '**/*droid*.csproj'
      outputDirectory: '$(outputDirectory)'
      configuration: '$(buildConfiguration)'
      msbuildVersionOption: '16.0'
      msbuildArguments: |
        /t:SignAndroidPackage /p:AndroidKeyStore="True" ... (additional signing vars)

我已确认选择了正确的构建配置(主要是因为无效配置显示为错误),但生成的二进制文件未按预期运行。通过命令行构建,我唯一能想到的不同之处在于我们正在构建一个特定的项目,而不是在解决方案中。但也许我使用错误的条件编译符号?我是否需要在命令行上指定编译符号,即使它们是在 csproj 中专门定义的?任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

原来在 PCL 项目中,我的 DefineConstants 仅限于 AnyCPU 构建;在构建时,Azure Devops 中的 XamariniOS 任务为 /p:Platform=iPhone 构建。为什么在本地调试时常量起作用我不确定,因为本地调试的构建应该是 iPhoneSimulator 而不是 AnyCPU。

【讨论】:

以上是关于Xamarin 形式;条件编译符号在 MSBUILD 命令行中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

预编译命令行由啥符号开头?

根据条件编译符号更改exe的名称

如何将条件编译符号(DefineConstants)传递给 msbuild

您可以从 msbuild.exe 命令行关闭条件编译符号吗?

从 xamarin.mac / xamarin.forms 的编辑菜单中删除表情符号和符号

构建整个解决方案,但仅为一个项目添加全局条件编译符号