C# &引用;已超过重试计数10。失败。”;因为csproj的错误配置

C# &引用;已超过重试计数10。失败。”;因为csproj的错误配置,c#,.net-core,gitlab-ci-runner,C#,.net Core,Gitlab Ci Runner,当试图编译一个相当大的解决方案时,只有几十个CSPROJ引用了无法复制的特定dll,这是随机发生的 <ItemGroup> <Reference Include="SomeLabrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> <HintPath>..\..\..\lib\some-library.dll</HintPath>

当试图编译一个相当大的解决方案时,只有几十个CSPROJ引用了无法复制的特定dll,这是随机发生的

<ItemGroup>
    <Reference Include="SomeLabrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
        <HintPath>..\..\..\lib\some-library.dll</HintPath>
    </Reference>
</ItemGroup>

..\..\..\lib\some-library.dll

我的问题是,我如何告诉dotnet编译器不要复制这个库,或者只复制一次,或者在复制之前比较它,或者在Linux系统中不锁定文件?啊,理智,我想念你。

对不起,我还不能评论,所以我试着回答

几年前,我在一个大项目中也面临着这个问题。我跟踪到VisualStudio在编译时启动的一个特定进程,该进程阻塞了.dll。然而,这一过程似乎并不需要。因此,我在后期构建中添加了taskkill命令来杀死它。我不记得阻塞过程是什么

不过,你可以像我那样做,然后得到,这可以帮助你找到手柄

当Process Explorer启动时,您可以按CTRL+F来搜索句柄,基本上只需在其中输入.dll名称。如果任何进程具有dll的文件句柄,它将显示在搜索中。当您遇到“无法复制”错误时,您有很好的机会找到该进程,它将重试几秒钟


如果你找到了这个过程,你也可以在这个上下文中尝试搜索。也许现在有比使用taskkill更好的解决方案。

找到了curlprit。这不是因为csproj或sln文件,甚至不是因为库文件。正是dotnet目标配置
publish
行为不端。它是在我重组解决方案并将
/bin
/lib
/src
等添加到根目录时添加的。因为同时改变多个事物总是一个好主意。
从编译器标志中删除
-publish
修复了该问题。

事实证明,解决方案中没有数百个项目的一百万开发人员的作战测试并没有带来一些错误:)

请您提供错误消息?@sayahimad这是标题中的错误消息。完整的错误消息如下:
错误MSB3027:无法将“/home/gitlab runner/builds/***/…/lib/some library.dll”复制到“../../../bin/publish/some library.dll”。已超过重试计数10。失败。[/home/gitlab runner/builds/***/../../*.csproj]
是否尝试删除bin和obj文件夹,请不要忘记重新启动vs?每次运行后,ci生成过程将停止存在。“构建会干扰自身而不是另一次运行。”我对strace很熟悉。我不知道我为什么不试试。我认为.net编译器是一个托管库。不管怎样,我都要试试。谢谢。不幸的是(我在跟谁开玩笑。幸运的是)这是在Linux环境中发生的,并且在每次编译之前环境都是新鲜的。可能仍然值得一试。在linux上,您的工具功能更强大,一项快速研究表明,您可能可以使用它来查找文件句柄