MSBuild 未使用 /p:Configuration=Release 和 -p:Configuration=Debug 进行编译

MSBuild not compiling with both /p:Configuration=Release and -p:Configuration=Debug

我们正尝试在 Azure 上使用 Kudu 在 DEBUG 配置中安装最新版本 Kentico (12) 的干净版本。我们传统上通过将 SCM_BUILD_ARGS 设置为 -p:Configuration=Debug 来实现这一点,一切都很好。但出于某种原因,在这个较新的版本中,项目无法编译,我看到这是命令 运行:

"C:\Program Files (x86)\MSBuild.0\Bin\MSBuild.exe" "C:\Users\User\Documents\GitHub\Project\CMS\CMSApp.csproj" /nologo /verbosity:m /t:Build /t:pipelinePreDeployCopyAllFilesToOneFolder /p:_PackageTempDir="C:\local\Tempd6d315018f5ff9";AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="C:\Users\User\Documents\GitHub\Project\.\" -p:Configuration=Debug

请注意 Configuration=ReleaseConfiguration=Debug。编译错误类似于以下代码行中的 Invalid expression term 'string'

bool licenseOK = LicenseHelper.CheckLicenseLimitations(FeatureEnum.Ecommerce, out int skuCount, out int maxSKUCount);

DebugRelease 模式下的 Visual Studio 中根本不会突出显示。我也可以在本地重现(如我上面的路径所示),如果我将两个配置更改为相同(无论我选择 Debug 还是 Release),它都可以编译。

我知道我能做的是创建我自己的自定义部署命令脚本文件作为解决方法,但我想我不明白为什么上面的 MSBUILD 命令一开始就不起作用。

关于为什么这对我在此之前的所有 ASP.NET 项目都非常有效,有什么想法吗?我知道的一件事是 Kentico 最近包含了 Roslyn 编译器,不幸的是我不太熟悉它 - 这可能是问题的一部分吗?

更新#1:似乎所有编译错误都与仅在 C# 7.0 中有效的代码有关。这可能是一个线索。

这一切都归结为一个事实,即较新版本的 Kentico 具有仅在 C# 7 中有效的代码,并且需要 MSBuild 15 才能编译。以下是我设置 Kudu 的方法:

  1. 在我的 repo 的根目录中添加一个名为 .deployment 的文件,仅包含以下内容。这告诉 Kudu 使用自定义部署脚本。

  2. 通过 FTP 从我的 Azure 应用服务下载 deploy.cmd 文件到我的存储库的根目录,并根据 https://github.com/projectkudu/kudu/issues/2350#issuecomment-373817740 更新它以使用 MSBuild 15小路。详情如下。

.部署文件内容

[config]
command = deploy.cmd 

deploy.cmd更新

1 - 添加 -MSBuildPath "%MSBUILD_15_DIR%" 到 nuget 调用。示例:

nuget.exe restore "{your .sln file path}" -MSBuildPath "%MSBUILD_15_DIR%"

2 - 在步骤 2. Build to the temporary path

下的两次出现中将 %MSBUILD_PATH% 替换为 %MSBUILD_15_DIR%\MSBuild.exe

这就是完成构建所需的全部内容。

正如 Keith 所提到的,这是 Kentico 12 使用的 C# 7.0 的兼容性问题。 mentions that you need to run MSBuild version 15 适用于 C# 7.0 代码。我 运行 使用 MSBuild 15 为我的本地 Kentico 12 项目执行了类似的调试命令,它成功了。