dotnet core build in parallel or simultaneously

让人想犯罪 __ 提交于 2021-01-21 08:07:39

问题


In this solution I have 2 apps: AppA, AppB that share class library Shared. I have tried automating the build/running of these in parallel with both a PowerShell and node scripts (I'd be open to other solutions). I'm using both --no-dependencies and --no-restore flags, but intermittently I get:

'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

node: run project build-script or node ./build-script/app.js

Why is the Shared project building even with the --no-dependencies flag? How do I build in parallel or simultaneously?


回答1:


Explanation for error CS2012 :The process cannot access the file

I could reproduce your issue and Process Monitor indicates that both processes open shared.dll at the same time for reading. This leads to the issue you described.

Although reading the same file from different processes can be done by using FileShare.Read as the documentation indicates (see excerpt below), it seems that this is NOT done by csc.exe. This is a shortcoming of csc.exe, which probably won't be changed in the near future.

Allows subsequent opening of the file for reading. If this flag is not specified, any request to open the file for reading (by this process or another process) will fail until the file is closed. However, even if this flag is specified, additional permissions might still be needed to access the file.

Solution

Instead of using Start-Process to achieve parallel building, you could use msbuild, which supports this out of the box.

Parallel build is supported by msbuild with /maxcpucount-switch and BuildInParallel-task parameter as described in MS build documentation.

Parallel build is enabled by using /maxcpucount-switch on commandline:

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

In addition it is also necessary to use BuildInParallel-task Parameter in project-file ParallelBuildAB.csproj. Please note that AppA.csproj and AppB.csproj are referenced:

<?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>


来源:https://stackoverflow.com/questions/47895162/dotnet-core-build-in-parallel-or-simultaneously

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!