如何在解决方案级别使用Microsoft.Net.Compilers?

时间:2017-04-13 13:37:41

标签: c# .net build msbuild

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

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

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

2 个答案:

答案 0 :(得分:16)

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

我们的想法是从安装软件包并将其添加到packages.config以进行恢复,只需在csproj文件中指定MSBuild项目即可。这可以在VS中为新项目设置: Switch from packages.config to ProjectReference (动画来自上面链接的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>

答案 1 :(得分:1)

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

  

右键单击您的解决方案&gt;管理NuGet包以获得解决方案......

......或者:

  

工具&gt;库包管理器&gt;管理NuGet包以获得解决方案......

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

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

对于新项目:

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

  • 创建一个项目。
      

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

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

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

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

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