【问题标题】:How can I use Microsoft.Net.Compilers at solution level?如何在解决方案级别使用 Microsoft.Net.Compilers?
【发布时间】:2017-09-09 16:01:40
【问题描述】:

我想开始使用Microsoft.Net.Compilers 来简化我们构建服务器的工作。但是,我只能通过将包添加到所有项目来使其在 per-project level 上工作。
这是有问题的,因为必须将包添加到每个新创建的项目中。这可能会导致代码在开发人员的机器(具有最新的编译器)上编译,但在构建服务器上会失败。我们有很多项目(超过 100 个),所以这种情况比较常见。

有没有办法在解决方案级别使用Microsoft.Net.Compilers

如果没有受支持的方式,是否有我不必在构建服务器上安装的命令行工具?或者,这不是这些工具的预期用途吗?

【问题讨论】:

标签: c# .net build msbuild


【解决方案1】:

如果在 VS 2017(更新 1,内部版本号 >= 15.1.*)中,您可以使用 MSBuild 集成的 PackageReference 机制,而不是以前仅适用于 .net 核心和 .net 标准项目类型的 packages.config。请参阅宣布支持的 PackageReference documentationNuGet blog post,尤其是“非 .NET Core 的其他项目类型怎么办?”部分。

我们的想法是从安装包并将其添加到 packages.config 以进行恢复转换为仅在 csproj 文件中指定 MSBuild 项目。这可以为 VS 中的新项目设置: (动画来自上面链接的 NuGet 博客文章)

MSBuild 15 的一个新功能是它支持自动在目录层次结构中包含具有特殊名称的文件。这些是Directory.Build.propsDirectory.Build.targets,它们将包含在您的项目文件内容之前(道具)和之后(目标)(对于即将发布修复的多目标项目,.targets 版本存在一个错误)。

如果您在解决方案级别创建具有以下内容的Directory.Build.props 文件,其下的目录层次结构中的所有项目都将继承其内容,您可以强制对每个项目使用 NuGet 依赖项:

<Project>
  <ItemGroup>
    <PackageReference Include="Microsoft.Net.Compilers" Version="2.1.0"/>
  </ItemGroup>
</Project>

【讨论】:

  • 谢谢!这听起来不错。现在,我将很难:这是否意味着我必须在我的构建服务器上安装 MSBuild 15? Microsoft.Net.Compilers 的“要点”不是我不应该安装它吗?
  • 嗯,在某些时候你必须更新服务器,即使它只是为新的 .NET 版本安装新的目标包(或为此使用非官方的 NuGet pkgs)。 MSBuild 不是编译器,它是使用编译器的构建系统。
  • 如果你不想在构建服务上安装任何东西,我建议考虑使用 Docker 容器构建(让每个存储库指定它需要的软件映像)或使用 .net CLI (".NET Core Sdk ") 可以构建“新世界”csproj 文件并包含 MSBuild 15 的自包含发行版 - GitHub 上的许多 appveyor 定义都有一个下载本地副本的步骤。
  • -1 因为我不明白这是如何回答问题的。问题是“如何在不需要 msbuild15 的情况下启用 .Compilers 解决方案”,但这个答案是“如何强制项目需要 msbuild15”
【解决方案2】:

对于解决方案中的现有项目:

右键单击您的解决方案 > 管理解决方案的 NuGet 包...

... 或者:

工具 > 库包管理器 > 管理用于解决方案的 NuGet 包...

然后通过浏览你的包将它添加到所有项目中,然后选中顶部的复选框,然后单击安装。

来源:https://stackoverflow.com/a/8653312/7007466


对于新项目:

为您需要的每种类型的项目(控制台、库等)创建一个模仿原始模板的模板,并将包添加到其中。

  • 创建一个项目。

    注意: 命名将成为模板源的项目时,仅使用有效的标识符字符。从使用无效字符命名的项目中导出的模板可能会在以后基于该模板的项目中导致编译错误。

  • 编辑项目,直到可以导出为模板。
  • 酌情编辑代码文件以指示应在何处进行参数替换。
  • 在文件菜单上,单击导出模板。导出模板向导随即打开。
  • 点击项目模板。
  • 如果您当前的解决方案中有多个项目,请选择要导出到模板的项目。
  • 点击下一步。
  • 为您的模板选择一个图标和一个预览图像。这些将出现在“新建项目”对话框中。
  • 输入模板名称和说明。
  • 单击完成。您的项目将导出为 .zip 文件并放置在指定的输出位置,如果选中,则导入 Visual Studio。

如果您安装了 Visual Studio SDK,则可以将完成的模板包装在 .vsix 文件中,以便使用 VSIX 项目模板进行部署。

来源:https://msdn.microsoft.com/en-us/library/xkh1wxd8.aspx

如果有人有比创建模板更简单的方法,我很乐意接受。

【讨论】:

  • 这可以工作,但是相当复杂,并且引入了显着的开销——不仅仅是将包添加到所有项目并对其进行维护。它仍然需要创建一个特殊的“程序”来创建项目。
猜你喜欢
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2020-07-20
  • 1970-01-01
  • 2018-09-05
相关资源
最近更新 更多