cnk700i 发表于 2019-9-10 21:13:12

Visual Studio Code调试Home Assistant代码(Docker版)

本帖最后由 cnk700i 于 2019-9-10 21:14 编辑


## 备注
- 拷贝自[博客](https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/),排版格式随缘,如有问题可看原文。。。
- 不设置隐藏了,觉得有用帮忙顶一下让更多人看到~

## 正文



上次使用VS Code在WSL下实现了Home Assistant代码的调试,对Visual Studio Code的远程调试功能有了一定的了解,现在再回头看一开始就折腾的Docker远程调试,很多问题迎刃而解。0.环境
[*]Win10 + Docker Desktop 2.1.0.1
[*]Ubuntu 18.04 + Docker CE 19.03.1
[*]Visual Studio Code 1.38.0
INFO:Windows需要Docker Desktop相关的工具提供支持。
1.方法简介Docker容器环境开发调试,需要一台Linux主机提供容器,本地Windows使用VS Code远程到容器环境运行代码。与使用WSL开发调试相比,有一个好处就是代码在Linux主机上,可以在不同的终端主机通过VS Code远程登录开发调试。不过缺点就是本地代码是没法直接和远程环境同步,不像WSL所加载的代码目录在Windows上是可以直接访问修改的。
使用Docker容器环境开发调试,可以根据项目工程的devcontainer.json文件实现镜像构建、插件安装、运行参数设定等一系列过程实现自动部署容器开发环境;也可以将代码加载到已有的容器中去运行。前一种由于本人理解有限加上上手较难,有兴趣可以观看VS Code文档结合HA代码工程(Github上的项目带有配置文件)实践部署。这里只介绍后一种方法,目标是以最简单的方法实现调试Home Assistant代码。2.Linuxdocker安装过程省略。
[*]开启Docker开启远程访问。复制
1
vi /lib/systemd/system/docker.service


复制
1
2
3
4
# /lib/systemd/system/docker.service 文件
# 修改ExecStart行
ExecStart=/usr/bin/dockerd-H tcp://0.0.0.0:2375-H unix:///var/run/docker.sock
#


WARN:这里的端口号不是自定义端口,只能用2375或2376,另外2375是不加密不验证的端口,有安全方面的要求请启用2376端口并进行相应设置,具体方法自行搜索。
[*]调大用户监视文件数,详细说明可以看这里。

[*]编辑配置文件复制
1
vi /etc/sysctl.conf


复制
1
2
3
# /etc/sysctl.conf 文件
# 末尾加入
fs.inotify.max_user_watches = 81920


INFO:默认数值是8192,最大是524,288。
INFO:容器的参数和宿主机一致,只能在宿主机修改。
[*]使能配置。复制
1
sysctl -p


[*]创建测试环境容器,用使用官方的镜像即可,根据需要调整版本号。复制
1
2
docker pull homeassistant/home-assistant:0.98.0
docker run -it --name demo -p 8456:8123 homeassistant/home-assistant:0.98.0 /bin/sh -c "while sleep 1000; do :; done"


INFO:也可以不设置端口映射,VS Code提供Remote-Containers: Forward Port from Container功能,分配到端口后可以在Windows通过localhost:[转发端口]访问。
2.WindowsDocker Desktop安装过程省略。
[*]VS Code安装Docker插件、RemoteDevelopment插件。https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p1_%E5%AE%89%E8%A3%85docker%E6%8F%92%E4%BB%B6.pnghttps://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p2_%E5%AE%89%E8%A3%85RemoteDevelopment%E6%8F%92%E4%BB%B6.png
[*]配置docker连接信息。https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p3_%E8%AE%BE%E7%BD%AEdocker%E4%B8%BB%E6%9C%BA%E5%9C%B0%E5%9D%80.pnghttps://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p4_%E6%88%90%E5%8A%9F%E8%BF%9E%E6%8E%A5docker%E4%B8%BB%E6%9C%BA.png
[*]连接容器,将会新建远程窗口,有两种方法。

[*]方法1:远程资源管理器中,选择容器->”Connect to Container”https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p5_%E9%80%9A%E8%BF%87RemoteDevelopment%E6%8F%92%E4%BB%B6%E8%BF%9E%E6%8E%A5%E5%AE%B9%E5%99%A8.png
[*]方法2:Docker插件中,容器窗->容器右键->”Attach Visual Studio Code”https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p6_%E9%80%9A%E8%BF%87Docker%E6%8F%92%E4%BB%B6%E8%BF%9E%E6%8E%A5%E5%AE%B9%E5%99%A8.png
[*]新窗口成功连接容器(左下角有变化)https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p7_%E6%88%90%E5%8A%9F%E8%BF%9E%E6%8E%A5%E5%88%B0%E5%AE%B9%E5%99%A8.png
[*]在容器中安装Python插件,代码调试需要。https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p8_%E5%AE%B9%E5%99%A8%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85%E6%8F%92%E4%BB%B6.png
[*]准备代码目录。

[*]打开主目录,因为官方镜像中程序代码位于/usr/src/homeassistant/homeassistant,可以直接使用/usr/src/homeassistant作为主目录而无需新建。https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p9_%E8%BF%9C%E7%A8%8B%E7%AA%97%E5%8F%A3%E6%89%93%E5%BC%80%E4%B8%BB%E7%9B%AE%E5%BD%95.png
[*]保留homeassitant文件夹,删除其它非必要文件(可选)。https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p10_%E5%8E%9F%E6%9C%89%E7%9A%84%E5%86%85%E5%AE%B9.png
[*]新建config目录,作为HA配置目录。
INFO:VS Code的文件资源管理中直接编辑即可,也支持拖拽上传下载的。
[*]新建debug.py,用于启动HA,内容如下:复制
1
2
3
4
5
from homeassistant import __main__ as hass_entry
import sys

if __name__ == "__main__":
    sys.exit(hass_entry.main())


[*]新建.vscode目录,.vscode目录下新建launch.json文件复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//launch.json内容
{
    // 使用 IntelliSense 了解相关属性。
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
      {
            "name": "Home Assistant Debug",
            "type": "python",
            "request": "launch",
            "program": "${workspaceRoot}/debug.py", //运行HA
            "console": "integratedTerminal",
            "args": ["-c", "config"], //指定配置文件
      }
    ]
}


[*]最终目录结构如图。https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c2_p11_%E5%A2%9E%E5%8A%A0%E8%B0%83%E8%AF%95%E7%94%A8%E7%9A%84%E6%96%87%E4%BB%B6.png

3.调试在远程窗口(连接到容器)下,菜单栏->调试->启动调试(快捷键F5)开始运行调试。如下图,可以看到能够正常追踪HA主程序断点以及自定义组件代码断点。
[*]启动过程断点https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c3_p1_%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B%E6%96%AD%E7%82%B9.png
[*]正常运行自定义插件断点https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c3_p2_%E5%90%AF%E5%8A%A8%E5%90%8E%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8F%92%E4%BB%B6%E6%96%AD%E7%82%B9.png
[*]网页调用服务触发断点https://ljr.im/articles/visual-studio-code-debugging-home-assistant-docker-version/c3_p3_%E7%BD%91%E9%A1%B5%E8%B0%83%E7%94%A8%E6%9C%8D%E5%8A%A1%E8%A7%A6%E5%8F%91%E6%96%AD%E7%82%B9.png
4.其它
[*]修改过的代码应及时备份到本地,以免删除容器丢失代码,也可以根据VS Code文档指引自动同步至本地。
[*]避免在断点停下来时候直接结束调试,这样进程不会退出无法释放端口,需要手工终止进程。复制
1
2
3
# VS Code新建终端
ps -aux | grep python | grep config
kill -9 [进程号]


5.小结
[*]远程调试不需要本地安装python运行环境,代码解析由远端的python运行;远程调试模式下远端会安装有VS Code服务程序,本地VS Code作为操作界面实现交互。
[*]得益于官方HA镜像的主程序代码没有在python安装目录,不需要另外下载代码包。另外不同版本的代码文件可以直接docker pull下来,初步使用下来比用WSL部署更方便。

blindlight 发表于 2019-9-11 13:53:07

如果直接用ptvsd和lz的有什么区别吗
https://www.home-assistant.io/components/ptvsd/

情非殇 发表于 2019-9-11 14:56:17

高大上,小白用户发来感谢信:lol

cnk700i 发表于 2019-9-11 18:15:22

本帖最后由 cnk700i 于 2019-9-12 00:18 编辑

blindlight 发表于 2019-9-11 13:53
如果直接用ptvsd和lz的有什么区别吗
https://www.home-assistant.io/components/ptvsd/
个人理解,ptvsd是python的一种远程调试方法,Remote Development插件好像实际上用的也是ptvsd,不过增加了一些管理功能。如果只用ptvsd组件,得本地代码有一份代码和远程一致,不像Remote Development可以直接编辑远程的代码。

luzai 发表于 2021-8-10 23:25:22

还是docker版本好用,省去了不少环境搭建的时间

cdl511 发表于 2023-3-18 13:10:51

感谢楼主分享:loveliness:
页: [1]
查看完整版本: Visual Studio Code调试Home Assistant代码(Docker版)