探索 .Net Core 的 SourceLink
介绍
Source Link是一组软件包和一个规范, 它将一些元数据添加到PDB文件,以将本地文件重新映射到GitHub上的文件,因此Visual Studio可以在这需要时下载文件, 该项目的目的是可以为使用Nuget安装软件的用户提供源代码调试, Microsoft库(例如.NET Core和Roslyn)都已启用Source Link。
使用NuGet包是向项目添加依赖项的一种非常方便的方法,但是,当您遇到NuGet软件包的问题并想对其进行调试时,会有点麻烦,你可能需要从在github 查看源代码,或者直接git clone到本地, Visual Studio 2017 15.3以上版本中已经集成了Source Link , 现在你可以非常方便的在VS中调试 .Net Core 和 Nuget分发的软件包的源代码,并且不需要安装 ReSharper 这些工具,这是非常愉快的源代码调试体验。
sourcelink 最初的版本是 @ctaggart 实现的,看了下,原项目已存档, 然后 .Net 团队开始注意到这个项目,和 ctaggart 一起做了现在的版本。
官网地址: https://github.com/dotnet/sourcelink
SourceLink 支持一下几种源代码来源:
github.com and GitHub Enterprise
GitLab
Azure Repos (former Visual Studio Team Services)
Azure DevOps Server (former Team Foundation Server)
Bitbucket
快速使用
必须满足 Visual Studio 2017 15.3以上版本,然后做一下简单的设置
打开 工具 -> 选项 -> 调试, 勾选 启用源链接支持,取消勾选 启用仅我的代码

设置符号包(symbol packages) 的地址,它包含了源代码文件的url地址

Newtonsoft.Json 是我经常使用的一个软件包, 也是 Nuget 下载量第一的包,我想看一下它的源代码,了解如何进行序列化的,我新建了一个 .Net Core 的控制台项目,现在断点在序列化的这一步

现在直接 F11 逐语句调试, 第一次的话,由于网络原因,可能会比较慢,等待即可

现在直接进入到了 Newtonsoft.Json 的源代码, 它将无缝地让我继续调试会话,非常方便, 如果您在公司内部使用Gitlab, Devops或在开源环境中发布了NuGet,则绝对应该使用SourceLink。
它的路径在 C:\Users\Spring Lee\AppData\Local\SourceServer\c15d6df0a4a5956040073c3613425e76998a1599e7eeac2338c52ed35d1a47b7\Src\Newtonsoft.Json\JsonSerializer.cs
在项目中使用SourceLink
接下来我会创建一个 netstandard2.0 版本的类库项目,它的源码放在了github,并且我会发布到 Nuget.org,当然其他方式(Azure Devops,Gitlab) 也是支持的,让它支持SourceLink
创建完成后,首先需要引入 Microsoft.SourceLink.GitHub

右键项目编辑项目文件, 编辑csproj文件
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
然后需要提交 git,推送代码。 准备工作完成后,项目右键,直接打包,会同时生成 .nupkg 和 .snupkg(符号包)

打开 .snupkg 文件,查看 PDB Sources, 发现pdb 文件包含了源代码文件的url地址

然后同时上传到 Nuget.org, 上传成功后,会同时有 package 和 symbols 的下载标识

到这里为止,一个支持source link 的nuget包已经发布成功了,你可以用同样的方式进行源代码调试
打个广告
HttpReports 是针对.Net Core 开发的轻量级APM系统, 基于MIT开源协议,针对于微服务场景,主要功能包括统计,分析,拓扑图,告警, 链路监控,请求日志等,感兴趣的同学可以点个 Star 关注下,谢谢
Github地址:https://github.com/dotnetcore/HttpReports
在线预览: http://122.51.188.23:8080
账号: admin 密码 123456

探索 .Net Core 的 SourceLink的更多相关文章
- 探索 .NET Core 依赖注入的 IServiceProvider
在上一篇文章中,我们学习了Microsoft.Extensions.DependencyInjection中的IServiceCollection,包括服务注册转换为ServiceDescriptor ...
- 探索 .NET Core 依赖注入的 IServiceCollection
如果您使用了.NET Core,则很可能已使用Microsoft.Extensions.DependencyInjection中的内置依赖项注入容器,在本文中,我想更深入地了解Microsoft De ...
- 探索 dotnet core 为何在 Windows7 系统需要补丁的原因
在一些 Windows 7 系统上,根据 dotnet 官方文档,需要安装上 KB2533623 补丁,才能运行 dotnet core 或 .NET 5 等应用.尽管非所有的设备都需要安装此,但这也 ...
- .Net Core迁移到MSBuild的多平台编译问题
一.前言 本篇主要讨论.NET Core应用程序项目结构的主题,重点探索.NET Core应用程序的多平台编译问题,这里指的多平台是指.NET Framework..NET Core App..NET ...
- EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
前言 终于踏出第一步探索EF Core原理和本质,过程虽然比较漫长且枯燥乏味还得反复论证,其中滋味自知,EF Core的强大想必不用我再过多废话,有时候我们是否思考过背后到底做了些什么,到底怎么实现的 ...
- Use SourceLink enables a great source debugging experience
posts Exploring .NET Core's SourceLink - Stepping into the Source Code of NuGet packages you don't o ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
- dotnet Core学习之旅(序)
.NET Core 新玩具,新工具,新生产力 我将在博客园我从0.1开始探索.NET Core 的过程. 为什么是从0.1开始而不是从0开始 我在微软刚宣布开源的时候便接触到了.NET Core 1. ...
- HMS Core AR Engine 2D图片/3D物体跟踪技术 助力打造更智能AR交互体验
AR技术已经被广泛应用于营销.教育.游戏.展览等场景.通过2D图像跟踪技术和3D物体跟踪技术,用户只需使用一台手机进行拍摄,即可实现海报.卡牌等平面物体以及文物.手办等立体物体的AR效果.尽管近年来2 ...
随机推荐
- junit调试(No tests found matching )
使用junit调试程序时报错:initializationError(org.junit.runner.manipulation.Filter)java.lang.Exception: No test ...
- mycat 单库分表实践
参考 https://blog.csdn.net/sq2006hjp/article/details/78732227 Mycat采用的水平拆分,不管是分库还是分表,都是水平拆分的.分库是指,把一个大 ...
- 面试一个百度T7程序员,一道简单的题没答上来!网友却都在吐槽面试官!
程序员面试时都考些什么? 一个面试官得意洋洋地说自己面了一个百度T7,出了一道coding题,结果对方连最长上升子序列都写不出来. 楼主本想嘲弄一下百度T7的代码水平低,没想到网友们炸开了锅,纷纷 ...
- monolog handler用哪个
Handlers 记录日志到文件与系统日志(syslog) StreamHandler:记录日志到任何 PHP stream,用它来记录到文件. RotatingFileHandler: 每天一个文件 ...
- linux(centos8):firewalld的运行时日志配置
一,firewalld配置日志的用途: 在生产环境中,firewalld的默认配置是不记录日志 我们通过日志记录下防火墙过滤时拒绝的非法ip, 可以主动把这些有攻击性的ip加入到黑名单, 防患于未然 ...
- python 爬取链家
import json import requests from lxml import etree from time import sleep url = "https://sz.lia ...
- deploy.php
<?php namespace Deployer; require 'recipe/common.php'; // Project name set('application', 'tp_web ...
- Luban图片压缩
导入依赖: implementation 'top.zibin:Luban:1.1.3' public class MainActivity extends AppCompatActivity { p ...
- 如何在Debian上安装和使用PHP Composer
1.条件 shell使用sudo权限访问正在运行的debian系统. 必须安装和配置5.3或更高版本的PHP. 2.在Debian上安装Composer 可以通过运行以下命令从getcomposer. ...
- 容器探针(liveness and readiness probe)
一.为什么需要容器探针 如何保持Pod健康 只要将pod调度到某个节点,Kubelet就会运行pod的容器,如果该pod的容器有一个或者所有的都终止运行(容器的主进程崩溃),Kubelet将重启容 ...