.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有两个变化:
构建执行隐式还原。这将更新 obj\project.assets.json 文件并在需要时下载缺少的 nuget 包。如果您在 windows 中的 IDE 和使用不同路径的基于 linux 的工具之间切换,这可能会更慢。使用 --no-restore
不这样做。
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\
以确保所有构建看到相同的值。
我是 .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有两个变化:
构建执行隐式还原。这将更新 obj\project.assets.json 文件并在需要时下载缺少的 nuget 包。如果您在 windows 中的 IDE 和使用不同路径的基于 linux 的工具之间切换,这可能会更慢。使用
--no-restore
不这样做。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\
以确保所有构建看到相同的值。