dotnet核心并行或同时构建

时间:2017-12-19 21:04:16

标签: node.js powershell .net-core dotnet-cli

this解决方案中,我有2个应用:AppAAppB共享类库Shared。我已尝试与PowerShellnode脚本并行地自动构建/运行这些脚本(我会对其他解决方案持开放态度)。我正在使用--no-dependencies--no-restore两个标志,但间歇地我得到了:

'CSC : error CS2012: Cannot open \'C:\\Users\\User\\source\\repos\\ParallelBuild\\Shared\\obj\\Debug\\netcoreapp2.0\\Shared.dll\' for writing -- \'The process cannot access the file \'C:\\Users\\User\\source\\repos\\ParallelBuild\\Shared\\obj\\Debug\\netcoreapp2.0\\Shared.dll\' because it is being used by another process.\' [C:\\Users\\User\\source\\repos\\ParallelBuild\\Shared\\Shared.csproj]\r\n'

的PowerShell: ./build.ps1 enter image description here

节点: 运行项目build-scriptnode ./build-script/app.js enter image description here

为什么Shared项目即使标有--no-dependencies标志?如何并行或同时构建?

1 个答案:

答案 0 :(得分:3)

错误说明CS2012:进程无法访问文件

我可以重现您的问题,Process Monitor表示两个进程同时打开shared.dll进行阅读。这导致您描述的问题。

虽然可以使用FileShare.Read作为documentation表示来阅读不同流程中的同一文件(参见下面的摘录),但似乎 NOT 完成了csc.exe。这是csc.exe的缺点,在不久的将来可能不会改变。

  

允许随后打开文件进行阅读。如果没有这个标志   指定,打开文件进行读取的任何请求(通过此过程   或其他进程)将失败,直到文件关闭。但是,甚至   如果指定了此标志,则可能仍有其他权限   需要访问该文件。

<强>解决方案

不是使用Start-Process来实现并行构建,而是使用msbuild,它支持开箱即用。

msbuild支持并行构建/maxcpucount - 切换和BuildInParallel - 任务参数,如MS build documentation中所述。

使用/maxcpucount - 启用命令行启用并行构建:

  

dotnet msbuild。\ ParallelBuildAB.csproj / target:build / restore:false   / maxcpucount:2

此外,还需要在项目文件ParallelBuildAB.csproj中使用BuildInParallel - 任务参数。请注意,引用了AppA.csprojAppB.csproj

<?xml version="1.0"?>
<Project name="system" default="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="build">
        <MSBuild BuildInParallel="true" Projects="./AppA/AppA.csproj;./AppB/AppB.csproj" Targets="Build"/>
    </Target>
</Project>