dotnet 构建 SourceRoot items must include at least one top-level item when DeterministicSourcePaths is
在使用 dotnet 构建的时候提示 error : SourceRoot items must include at least one top-level (not nested) item when DeterministicSourcePaths is true 构建失败
我在库里使用了 SourceLink 这个库,用来关联代码,详细请看 dotnet 使用 SourceLink 将 NuGet 链接源代码到 GitHub 等仓库
此时在构建时候有如下提示
C:UsersrunneradminAppDataLocalMicrosoftdotnetsdk3.1.300RoslynMicrosoft.Managed.Core.targets(104,5): error : SourceRoot items must include at least one top-level (not nested) item when DeterministicSourcePaths is true [D:adotnetCampus.IpcdotnetCampus.IpcsrcdotnetCampus.Ipc.AbstractionsdotnetCampus.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/post/dotnet-%E6%9E%84%E5%BB%BA-SourceRoot-items-must-include-at-least-one-top-level-item-when-DeterministicSourcePaths-is-true-%E5%A4%B1%E8%B4%A5.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。
以下是广告时间
推荐关注 Edi.Wang 的公众号
欢迎进入 Eleven 老师组建的 .NET 社区
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Flutter 实战】自定义动画-涟漪和雷达扫描
- Flutter —布局系统概述
- 【Flutter 实战】全局点击空白处隐藏键盘
- 我对Flutter的第一次失望
- 【Flutter 实战】各种各样形状的组件
- 『Flutter-绘制篇』实现炫酷的雨雪特效
- 图书管理系统(Servlet+Jsp+Java+Mysql,附下载演示地址)
- Vuex 映射完全指南
- 我们是如何改进YOLOv3进行红外小目标检测的?
- Unity3D网络通讯(三)-- HttpRestful请求的简单封装
- 详解Elasticsearch 的性能优化
- console.log的那件事
- Codeforces Round #668 (Div. 2)A-D
- nodejs源码解析之udp服务器
- LeetCode | 35.搜索插入位置