MSBuild无法同时使用/ p:Configuration = Release和-p:Configuration = Debug进行编译

时间:2019-05-08 22:02:00

标签: asp.net msbuild roslyn kentico kudu

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

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

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

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

调试发布模式下,在Visual Studio中根本不突出显示此内容。我还可以在本地复制(如上面的路径所示),并且如果我将两个配置都更改为相同(无论我选择“调试”还是“发行”),它都可以编译。

我知道我能做的是创建自己的自定义部署命令脚本文件作为变通办法,但是我想我不明白为什么上面的MSBUILD命令最初不起作用。

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

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

2 个答案:

答案 0 :(得分:0)

全部归结为以下事实:较新版本的Kentico具有仅在C#7中有效的代码,并且需要MSBuild 15进行编译。这是我设置Kudu的方法:

  1. 在我的仓库的根目录中添加一个名为.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 -在步骤%MSBUILD_PATH%

下两次出现的情况下,都将%MSBUILD_15_DIR%\MSBuild.exe替换为2. Build to the temporary path

这是完成构建所需的一切。

答案 1 :(得分:0)

正如Keith所提到的,Kentico 12使用的是C#7.0的兼容性问题。 This SO thread提到您需要为C#7.0代码运行MSBuild version 15。我使用MSBuild 15为本地Kentico 12项目运行了类似的调试命令,并成功完成了。