dotnet 构建 SourceRoot items must include at least one top-level item 失败

在使用 dotnet 构建的时候提示 error : SourceRoot items must include at least one top-level (not nested) item when DeterministicSourcePaths is true 构建失败

我在库里使用了 SourceLink 这个库,用来关联代码,详细请看 dotnet 使用 SourceLink 将 NuGet 链接源代码到 GitHub 等仓库

此时在构建时候有如下提示

C:\Users\runneradmin\AppData\Local\Microsoft\dotnet\sdk\3.1.300\Roslyn\Microsoft.Managed.Core.targets(104,5): error : SourceRoot items must include at least one top-level (not nested) item when DeterministicSourcePaths is true [D:\a\dotnetCampus.Ipc\dotnetCampus.Ipc\src\dotnetCampus.Ipc.Abstractions\dotnetCampus.Ipc.Abstractions.csproj]

解决方法就是在 csproj 等定义 SourceRoot 这个属性的值,这个值需要表示当前的源代码的最顶层路径

<ItemGroup>
  <SourceRoot Include="../"/>
</ItemGroup>

下面是整个 csproj 的定义代码,方便大家了解上面代码写在哪

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <Nullable>enable</Nullable>
    </PropertyGroup>

    <ItemGroup>
        <SourceRoot Include="../"/>
    </ItemGroup>

上面代码使用的是相对的路径,而一个比较好的方法是写在 Directory.Build.props 文件里,关于 Directory.Build.props 文件,请看 Roslyn 使用 Directory.Build.props 文件定义编译

在 Directory.Build.props 文件添加如下代码就可以

<ItemGroup>
  <SourceRoot Include="$(MSBuildThisFileDirectory)/"/>
</ItemGroup>

上面代码的 $(MSBuildThisFileDirectory) 表示的是当前文件所在的文件夹,这是构建时的常量,更多常量请看 项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - walterlv

本文的解决方法是在 DeterministicSourcePaths can break building if source control information not available · Issue #37379 · dotnet/roslyn 找到的

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

lindexi_gd CSDN认证博客专家 C# WPF UWP 微软最具价值专家
我是微软Windows应用开发方向的最具价值专家,欢迎访问我博客blog.lindexi.com里面有大量WPF和UWP博客
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页