【问题标题】:.Net Core 2.0 build under cygwin.Net Core 2.0 在 cygwin 下构建
【发布时间】:2018-01-09 14:59:01
【问题描述】:

我是 .NET Core 初学者,我有几个项目依赖于 proj_core

项目1 项目2 ... ... proj_core

还有一个简单的文件 build.sh 在 cygwin 下运行:

build_one_proj()
{
    ...
    dotnet build --configuration Debug  --output "../bin" --framework $NETCOREVER
    ...
}

build_one_proj proj1
build_one_proj proj2
...

升级到 .NET Core 2.0(相同的 build.sh)后,它的表现如此不同:

.NET Core 1.1:构建时间短(平均时间

.NET Core 2.0:构建时间长(平均时间> 60秒),根据输出我猜所有项目都在构建,尤其是proj_core重复构建。

我阅读了有关构建选项的文档并在 Google 上进行了搜索,但仍然没有任何线索。哪位大神可以赐教一下,谢谢。

【问题讨论】:

    标签: .net-core-2.0


    【解决方案1】:

    如果您之前使用 project.json 构建 .NET Core 1.0/1.1 应用程序,那么迁移到 2.0 的 csproj / MSBuild 工具将会很明显。

    请注意,2.1 和 2.2 版本的 SDK(!,而不是运行时)目前正在发生一些变化。

    2.0有两个变化:

    1. 构建执行隐式还原。这将更新 obj\project.assets.json 文件并在需要时下载缺少的 nuget 包。如果您在 windows 中的 IDE 和使用不同路径的基于 linux 的工具之间切换,这可能会更慢。使用--no-restore 不这样做。

    2. ASP.NET Core 2.0 引入了 Microsoft.AspNetCore.All 元包,向构建中添加了大量 NuGet 包和 DLL,您可以从应用程序中引用它们。 MSBuild 花费大量时间在这些 DLL 的路径中搜索其他资产(调试符号、其他 DLL、资源附属程序集)。这将在 2.2 工具中删除,因为所有已知资产都是事先已知的。

    此外,2.1 CLI 中的文件通配(发现项目中的文件)比 2.0 中更快。但是当有一个非常大的目录(例如node_modules)不需要时,最好排除它。 ASP.NET Core 会在项目根级别排除一个node_modules 文件夹,但如果在不同位置有另一个文件夹或项目不是 ASP.NET Core,设置可能会更快:

    <DefaultItemExcludes>$(DefaultItemExcludes);path\to\node_modules\**</DefaultItemExcludes>
    

    MSBuild 可以识别这种模式,甚至不考虑枚举该目录的内容。

    您还传递了一个“输出”参数。请注意,当使用不同的参数调用项目时,这会导致一些额外的构建时间,例如如果不使用此参数,则通过 IDE 或构建为引用项目时。

    我建议在 csproj 文件中的 PropertyGroup 中设置 &lt;OutputPath&gt;path\to\dir\&lt;/OutputPath&gt; 或在解决方案目录中创建 Directory.Build.props 文件,将其设置为例如$(MSBuildThisFileDirectory)bin\ 确保所有构建都看到相同的值。

    【讨论】:

    • 感谢您的帮助。我的项目不是 ASP.NET Core,并且项目文件夹中没有 node_modules。我还需要在 *.csproj 中添加 吗?如果有,node_modules 路径是什么?
    • 没有。但是,如果您需要更多帮助,则必须更具体地了解您切换的 sdk 版本,并可能在示例解决方案中重现它。
    猜你喜欢
    • 2018-07-09
    • 2018-01-31
    • 1970-01-01
    • 2018-05-14
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多