如何配置多.NET6项目共享依赖,用dotnet watch避免文件占用?
解决多个.NET6项目同时使用dotnet watch依赖共享项目的文件占用问题
项目结构
\A.csproj(引用\Infra.csproj) \B.csproj(引用\Infra.csproj) \otherapp\C.csproj(引用\..\Infra.csproj) \Infra.csproj
问题描述
我拥有多个依赖同一共享项目Infra.csproj的.NET6项目,希望同时构建并运行它们。当前通过脚本在新cmd窗口中启动dotnet watch时,出现问题:当一个项目构建共享项目后,其他项目会因文件被占用而卡住,报错信息为:
The process cannot access the file '\Infra\obj\Debug\net6.0\Infra.dll' because it is being used by another process.
解决方案
方法1:为每个依赖项目配置独立输出目录
在A.csproj、B.csproj、C.csproj这些依赖项目的配置文件中,添加独立的中间输出和最终输出目录配置,让每个项目构建时将共享项目的产物复制到自己的专属目录,避免文件竞争:
<PropertyGroup> <!-- 每个项目生成唯一的中间输出目录,用项目名区分 --> <IntermediateOutputPath>obj\Debug\net6.0\$(MSBuildProjectName)\</IntermediateOutputPath> <!-- 每个项目生成唯一的最终输出目录 --> <OutputPath>bin\Debug\net6.0\$(MSBuildProjectName)\</OutputPath> </PropertyGroup>
方法2:预构建共享项目,禁用watch的自动构建
先手动构建一次共享项目,再启动各个项目的dotnet watch时跳过构建步骤,避免多个watch进程重复编译共享项目:
- 先执行共享项目的构建:
dotnet build Infra.csproj - 分别启动各个项目的watch:
dotnet watch run --project A.csproj --no-restore --no-build dotnet watch run --project B.csproj --no-restore --no-build dotnet watch run --project otherapp/C.csproj --no-restore --no-build
注意:如果共享项目Infra.csproj有代码修改,需要重新执行第一步的构建命令,再重启各个watch进程。
方法3:启用文件锁定感知构建
在共享项目Infra.csproj中启用.NET的文件锁定感知构建特性,让构建系统自动处理文件占用问题:
<PropertyGroup> <EnableFileLockingSensitiveBuildOutput>true</EnableFileLockingSensitiveBuildOutput> </PropertyGroup>
该配置会改变构建产物的生成方式,减少文件被持续锁定的概率,降低冲突发生的可能。
内容的提问来源于stack exchange,提问作者kosmos
相关产品推荐
相关产品推荐

