在并行或同时构建Dotnet Core

10
这个解决方案中,我有两个应用程序: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

node: 运行build-scriptnode ./build-script/app.js来启动项目。 enter image description here

为什么使用--no-dependencies标志时仍然会构建Shared项目?如何并行构建或同时构建?


你是如何调用构建过程的?请发布你的代码。 - Maximilian Burszley
@TheIncorrigible1 所有的代码都在仓库里。 - William Lohan
没注意到链接,谢谢。 - Maximilian Burszley
1
我能够重现你的问题,但这种情况很少发生。它可以正常工作9次,然后就会失败。使用Process Monitor v3.40,我观察了访问shared.dll的进程,并且可以看到在构建期间,两个构建进程都会读取shared.dll。这是为了从中读取元信息而必需的。 - Aedvald Tseh
1个回答

6

错误 CS2012 的解释:无法访问文件

我能够重现您的问题,并且Process Monitor表明两个进程同时打开shared.dll进行读取。这导致了您描述的问题。

虽然使用FileShare.Read可以在不同进程中从同一文件进行读取,正如文档所示(见下面的摘录),但似乎csc.exe并没有这样做。这是csc.exe的一个缺点,可能在不久的将来不会改变。

允许随后打开该文件进行读取。如果未指定此标志,则任何尝试 以读取方式打开文件(由本进程或另一个进程)都将失败,直到关闭该文件。 然而,即使指定了此标志,仍可能需要其他权限才能访问该文件。

解决方案

您可以使用msbuild代替Start-Process实现并行构建,因为msbuild已经支持此功能。

MS build文档中描述了使用/maxcpucount-switch和BuildInParallel-task参数来支持并行构建。

使用以下命令在命令行中启用并行构建:

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

此外,还需要在项目文件ParallelBuildAB.csproj中使用BuildInParallel-task参数。请注意,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>

那我需要创建一个新的项目 ParallelBuildAB.csproj 来并行构建这两个项目吗?另外,它们可以从同一条命令中运行吗? - William Lohan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接