【问题标题】:MSBuild command line with C# 6.0 code fails to build带有 C# 6.0 代码的 MSBuild 命令行无法构建
【发布时间】:2015-12-29 22:17:48
【问题描述】:

我在让 MSBuild 编译 c# 6.0 代码时遇到问题,它在尝试构建表达式主体语法等时报告失败。

所以多年来我一直在创建这样的构建项目。我有一个带有一些参数的 msbuild 的 powershell 脚本:

msbuild.exe _build\build.proj
        /p:Build_Number=1.2.0
        /p:Configuration=QA
        /p:SolutionName=MPGCS-Api.sln
        /ToolsVersion:14.0

我确认 msbuild.exe 来自 C:\Program Files (x86)\MSBuild\14.0\Bin ,我通过进入该文件夹并指定完整的物理路径来做到这一点.proj 文件。我得到了同样的错误。

我一直在寻找有关如何使用 C# 6.0 设置 MSBuild 项目文件的示例,但没有成功,所以这是我的基本设置(这是 build.proj 文件)。如果我不得不猜测我没有导入正确的目标等。但我有点迷茫。这是我的项目文件:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Root>$(MSBuildStartupDirectory)</Root>
    <NugetExe>$(Root)\_build\lib\nuget\nuget.exe</NugetExe>
    <Build_Number>0.0.0</Build_Number>
    <SolutionName></SolutionName>
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
    <VisualStudioVersion>14.0</VisualStudioVersion>
  </PropertyGroup>

  <Target Name="Clean">
    <!-- Clean up -->
    <ItemGroup>
      <FilesToDelete Include="$(Root)\_build\Artifacts\**\*.*" />
      <FilesToDelete Include="$(Root)\_build\Published\**\*.*" />
    </ItemGroup>
    <Delete Files="@(FilesToDelete)" ContinueOnError="false" />

    <!-- Ensure directories exists -->
    <MakeDir Directories="$(MSBuildProjectDirectory)\Artifacts" Condition="!Exists('$(MSBuildProjectDirectory)\Artifacts')" />
    <MakeDir Directories="$(MSBuildProjectDirectory)\Published" Condition="!Exists('$(MSBuildProjectDirectory)\Artifacts')" />
  </Target>

  <Target Name="Debug" AfterTargets="Clean">
    <!-- Diagnostics -->
    <Message Text="Diagnostics:"/>
    <Message Text="Build Number:    $(build_number)" />
    <Message Text="Configuration:    $(Configuration)" />
    <Message Text="VisualStudioVersion:    $(VisualStudioVersion)" />
    <Message Text="Project root:    $(Root)" />

    <!-- Restore Nuget Packages -->
    <Message Text="Restoring nuget..."/>
    <Exec Command="$(NugetExe) restore $(Root)\$(SolutionName)" />
  </Target>

  <Target Name="GenerateOctopackAPI" AfterTargets="Debug">
    <ItemGroup>
      <ProjectToBuild Include="$(Root)\MPG.CS.Api\MPG.CS.Api.csproj" />
    </ItemGroup>
    <MSBuild Projects="@(ProjectToBuild)" ContinueOnError="false" Targets="Rebuild" Properties="
      RunOctoPack=true;
      Configuration=$(ProjectBuildMode);
      Platform=AnyCpu;
      TargetFrameworkVersion=$(TargetFrameworkVersion);
      VisualStudioVersion=$(VisualStudioVersion);
      OctoPackPublishPackageToFileShare=$(Root)\_build\Artifacts;
      OctoPackPackageVersion=$(Build_Number);
      OctoPackProjectName=UI;
      OutputPath=bin\$(ProjectBuildMode)" />
    </Target>
</Project>

这是我的“调试”目标中的一些信息,如您所见,根据我在网上阅读的一些建议,我将 VisualStudioVersion 设置为 14.0

 Diagnostics:
  Build Number:    1.2.0
  Configuration:    QA
  VisualStudioVersion:    14.0
  Project root:    C:\dev\mpg\MPGCS-Api

这是一个示例错误,它基本上在 c# 6.0 代码上失败,如果我要删除 c# 6 代码,一切都会编译:

TicketType.cs(19,28): error CS1002: ; expected [C:\dev\mpg\MPGCS-Api\MPG.CS.Model\MPG.CS.Model.csproj]
  TicketType.cs(19,44): error CS1519: Invalid token '(' in class, struct, or interface member declaration [C:\dev\mpg\MPGCS-Api\MPG.CS.Model\MPG.CS.Model.cs proj]
  TicketStatus.cs(16,36): error CS1002: ; expected [C:\dev\mpg\MPGCS-Api\MPG.CS.Model\MPG.CS.Model.csproj]
  TicketStatus.cs(16,53): error CS1519: Invalid token '(' in class, struct, or interface member declaration [C:\dev\mpg\MPGCS-Api\MPG.CS.Model\MPG.CS.Model. csproj]
  TicketStatus.cs(16,82): error CS1519: Invalid token '(' in class, struct, or interface member declaration [C:\dev\mpg\MPGCS-Api\MPG.CS.Model\MPG.CS.Model. csproj]

这是失败的一行(C# 6 代码):

public bool IsAbbreviated  => (Title.ToLower() == "open" || Title.ToLower() == "closed");

我很茫然,我认为只要使用正确的 msbuild.exe 就可以让我利用 c# 6.0。任何帮助将不胜感激。

【问题讨论】:

    标签: c# powershell msbuild


    【解决方案1】:

    如果您在构建服务器上运行 powershell 脚本,与您的开发环境分开,您需要确保机器本身可以处理 C# 6.0。由于它一起使用不同的编译器,因此如果未安装 VS 2015,它将无法工作。或者,您可以添加 Microsoft.Net.Compilers nuget 包作为依赖项,以允许 VS 2012 和 VS 2013 编译它。

    【讨论】:

    • 我在本地运行
    • 你能告诉我你安装了什么版本的VS和.NET吗?并发布在 MSBuild 期间爆炸的线路(或类似的线路)?
    • 我安装了 VS 2015,我将使用失败的示例代码更新问题。
    • 我还必须安装 nuget 包 Microsoft.Net.Compilers:请参阅我的答案:stackoverflow.com/a/36774876/584714
    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 2017-09-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多