.Net Core 2.0 在 cygwin 下构建

.Net Core 2.0 build under cygwin

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

proj1 proj2 ... ... proj_core

和cygwin下的一个简单文件build.sh 运行:

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: short build time (average time < 20 seconds), console output show only modified projects be build.

.NET Core 2.0: long build time (average time > 60 seconds), assording to output I guess all projects be build, especially proj_core be build repeatedly.

我阅读了有关构建选项的文档并进行了谷歌搜索,但仍然一无所知。有哪位大神能赐教吗,thx

如果您以前使用 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 识别此模式,甚至不考虑枚举此目录的内容。

您还传递了一个 "output" 参数。请注意,当为此使用不同参数调用项目时,这会导致一些额外的构建时间,例如通过 IDEs 或在未使用此参数的情况下构建为引用项目时。

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