Visual Studio工具箱:加速SDK样式的构建。NET项目

莱斯利·理查森

VisualStudio工具箱展示通过关注VisualStudio内外的工具,帮助您成为一名更有效率的开发人员。我们最新一集的VS工具箱学习YouTube网站)特写来自的Drew Noakes。NET团队。他演示了如何显著减少SDK风格的构建时间。NET项目。

什么是构建加速?

为生成加速。NET SDK风格的项目是一种opt-in功能,它指示Visual Studio仅生成经过修改的项目,而跳过未更改的项目。启用构建加速可以将SDK样式的增量构建时间减少80%。NET项目。

要在解决方案中启用生成加速,请添加或编辑顶级目录。构建.props文件包含以下内容:

<项目><属性组><加速构建InvisualStudio>真的</加速构建InvisualStudio></属性组></项目>

构建加速是如何工作的?

Visual Studio使用MSBuild进行生成。NET项目。调用MSBuild来生成每个项目会带来一些开销,因此VisualStudio使用“快速最新检查”(FUTDC)来避免在需要时调用MSBuild。该FUTDC可以快速确定项目中是否有任何可能导致需要构建的更改。

有时,FUTDC确定不需要编译,但确定需要从当前项目或引用的项目复制到输出目录中的一些文件。从历史上看,在这种情况下,即使不需要编译,FUTDC也会调用MSBuild来生成项目。这样做是为了确保文件被复制到输出目录。使用生成加速功能,VisualStudio将直接执行这些文件复制,而不是调用MSBuild来执行这些复制。

在VS工具箱秀上了解有关构建加速的更多信息!

查看下面的Visual Studio工具箱一集,看看Build Acceleration的实际应用,然后尝试新功能!

20条评论

讨论结束。登录以编辑/删除现有评论。

  • 罗斯迪·卡西姆 5

    为什么这不是默认值?一定有陷阱?兼容性问题?

    • 德鲁·诺克斯Microsoft员工 1

      在一些边缘情况下,它可能无法可靠地工作,而导致人们的构建中断从来都不是一种选择。正如Manuel在一篇兄弟评论中所指出的那样,我们正在调查默认情况下如何打开它。

      • 朱尼斯·温伯格DEAC 0

        >例如,如果项目的生成具有对项目的正确运行非常重要的编译后步骤,则生成加速在绕过MSBuild时将无法正确地再现这些步骤。https://github.com/dotnet/project-system/blob/main/docs/build-acceleration.md限制

        这是否意味着使用ilmerge/ilrepack(在构建之后运行)将恰好是不应该打开构建加速的情况?

  • 阿尔伯特·扎基亚 1

    最后…
    我想自1978年以来,大多数其他非微软开发平台都是这样做的?你怎么花了这么长时间?
    你能评论一下为什么你的ide太慢吗?为什么它一直挂着?我有256GB内存的服务器,但IDE挂起了。不仅在一台服务器上,而且在我所有客户的所有服务器上。

  • 马克西米利安·哈鲁·拉迪亚 0

    这样的功能不应该也在MSBUILD中吗?

    • 随机(Rand Random) 0

      我怀疑对MSBUILD投入了大量资金,因为“新”构建机制是dotnet构建,所以这似乎是提高性能的一个增量步骤,而从MSBUILD切换到dotnet构造仍然不可行,dotnet生成可能包含此功能。

        • 随机(Rand Random) 0

          谢谢,我不知道。
          甚至阅读https://stackoverflow.com/questions/663449892看起来不像这样。

          为什么dotnet构建仅限于sdk项目,而msbuild可以构建所有项目?如果dotnet构建确实在使用msbuild

          • 伊桑·林德曼 2

            MSBuild是一个复杂的怪兽。MSBuild有两个版本。MSBuild和MSBuild核心。方法编译MSBuild。NET Framework和MSBuild Core是使用现代dotnet内核编译的。您可能已经注意到,dotnet sdk使用了不支持的MSBuild Core。NET Framework项目,而Visual Studio使用原始MSBuild以支持。NET Framework应用程序和dotnet SDK样式的项目。希望这有帮助

    • 德鲁·诺克斯Microsoft员工 1

      VisualStudio是一个长期存在的过程,在您请求生成时,它对您的项目有很多了解。它可以执行一些快速检查,并确定在几毫秒内不必调用MSBuild的情况。相比之下,MSBuild更多的是一种一次性操作,在这种操作中,当请求项目生成时,需要读取它导入的所有属性/目标文件(有很多),需要扩展所有文件系统全局变量(这可能需要一段时间),并且在任何生产性工作发生之前都要进行大量的记账工作,或者在明确无需构建之前。

      我们正在调查是否可以将这些好处带到其他领域,所以希望这些性能好处也能出现在其他情况下。

  • 赛拉姆·科努鲁 2

    真的是一个很好的功能,为开发人员节省了很多时间。

  • 保罗·平托 0

    是怎么回事。NET工具,我们现在只能直接更改XML内容,而不能像中那样更改项目属性。NET框架?

    该功能本身是受欢迎的,并为此表示感谢。

    • 德鲁·诺克斯Microsoft员工

      当前的属性UI是逐项目的,这意味着将其应用于所有需要进行多次编辑的项目(这将需要多次单击)。在这里修改XML几乎可以肯定比这更快,而且还有一个额外的好处,即该属性将自动应用于将来创建的任何新项目。

      也就是说,我们希望为“目录”创建更好的属性编辑体验。Build.props`文件,尽管我们不清楚它是如何工作的。作为一个挑战的例子,这些文件可能有很多,并且它们可以应用于项目的一个子集。我们可能还想显示给定项目中覆盖了哪些属性,并允许重置这些属性。

      我们正在研究默认情况下是否启用Build Acceleration,在这种情况下,您根本不需要编辑XML即可使用此功能。

      • 安迪·帕特里克 0

        你所面临的基本问题是将东西隐藏在一个不可见的目录中。Build.props文件是一个可怕的选择,句点。在可发现性、可用性和维护方面都令人震惊。所以也许……不要那样做?

        • 豪尔赫·莫拉莱斯·维达尔 1

          如果你是UI第一,以UI为中心,那么你说的是真的。然而,现在一切都保存在Git repo中,VS和VS Code可以显示文件夹中任何位置的文件,并且它不会隐藏在文件系统中的某个隐蔽位置。

  • 马克·戴尔 0

    不幸的是,这仅限于SDK样式的项目,因为没有内置模板来创建。NET Framework SDK样式项目和。NET SDK项目无法转换为。Visual Studio中的NET Framework SDK项目。我听说可以通过手动编辑项目文件来创建一个,但这并不是那么简单,而且对开发人员来说也不明显。由于VisualStudio本身不支持此功能,因此看起来它实际上不受支持。

    • 德鲁·诺克斯Microsoft员工 1

      你说得对。SDK风格项目中的NET Framework不受官方支持。也就是说,它通常工作得很好,VisualStudio的许多组件都指定了。来自SDK样式项目的NET Framework。虽然您确实需要手动修改项目文件(例如`.csproj`),但通常只需要将`net7.0`更改为`net4.8`。

      也就是说,我们正在调查将构建加速应用于的其他领域。网络。

  • 珊京哲 0

    这一最新发展是一场真正的革命,它为我们节省了宝贵的时间和呼吸,同时也为我们等待那些永无止境的编译。我亲自尝试了这个功能,让我告诉你,这绝对是一个令人振奋的功能。但是,嘿,让我们保持真实。虽然它带来了一波令人敬畏的浪潮,但它仍有一些怪癖需要解决。有时,它可能会对我们的代码lint进行隐藏和搜索,并引发一些令人惊讶的引用问题。哦,PostSharp并不总是想跟着跳舞。但不用担心,只要稍加爱护和改进,这个功能就有可能达到新的高度。因此,让我们拥抱这场革命,享受其中的好处,并继续推动更大的改进!

反馈usabilla图标