我的 PHP 开发工作设置
目前,我的主要(编程)工作是(按代码量排序):PHP、Javascript(包括 Node)、CSS、HTML 和 Shell 脚本。我有时会尝试其他语言,但与这些主要语言相比,这种情况很少见。
这就是我的故事。
硬件
我正在我的主力电脑上写这篇文章。它运行的是 Windows 11,但这几乎完全是为了重要的游戏目的。
工作单位给我配了一台 MacBook Pro,我需要用它来处理一些重要的公司事务,比如访问 VPN,也因为它的视频会议体验更好。但实际上,我只是把它当成 Docker 主机和网络代理来用。我不太喜欢苹果的键盘,它混合了英制 ISO 和美制 ANSI,打字感觉就像在小孩子的玩具上一样。我很欣赏它的触控板和屏幕,它们都令人印象深刻——但我更喜欢用鼠标。所以 Mac 只能沦为我办公桌角落里的第三块屏幕。
这是一个混合包。
我有一台笔记本电脑,偶尔会在厨房餐桌上工作时使用。它运行的是 ChromeOS,不过以后我可能会换成 Linux。ChromeOS 的“开发者”模式允许我访问命令行和 Shell,所以我使用浏览器/命令行的工作流程基本相同。
操作系统

我所做的一切工作都是通过 Windows 11 桌面上的 WSL 下的 Ubuntu、ChromeOS 笔记本电脑上的 SSH 或 MacBook Pro 上的 Barrier'd 进行的。
我知道这听起来不太实际。确实存在一些奇怪的问题,比如苹果的 bug,你无法使用 IPv4 地址进行/etc/hosts
外部连接,因为防火墙会阻止它,但你可以使用 IPv6 地址,即使你不是通过 IPv6 连接的。哦,搞清楚这个 hack 的过程真是妙趣横生。
虽然十年前的我从未想过这一点,但如今的 Windows Linux 子系统(特别是 WSL2)实际上已经相当不错了。如果你安装了 X 服务器,你甚至可以运行 X 应用程序,而且有很多这样的应用程序可用。
不过,我根本不用 X。如果不是在浏览器中,我一般不会在意它。而且,相比原生浏览器,通过 X 使用 Linux 浏览器也没什么意义。
我禁不住因为使用 Windows 而感到有点不雅,但我把这种感觉深埋在心里并试图忽略它。
桌面 -屏障
我现在已经不怎么用这个了,但 Barrier 是 Synergy 闭源前的一个分支。它自称是一种软件 KVM,但归根结底,它让我可以在不同的电脑之间移动鼠标,就像在 PC 上的两个显示器之间移动一样。如果我把鼠标移出桌面显示器的右侧,它就会出现在我的 MacBook 上,所有鼠标和键盘的输入都会无缝传输到那里,就像一个整体一样。
标签#gamechanger。
终端 - WezTerm
我最近才开始使用 WezTerm。“最近”在终端术语中指的是过去一两年,因为这个世界发展缓慢。除非有充分的理由,否则我不会轻易改变。
那么我的理由是什么呢?Windows Terminal/iTerm 2 到底出了什么问题?好吧,WezTerm 是跨平台的,我可以在不同的主机之间共享相同的配置——用 Lua! 编写的。它不会做出奇怪的限制(比如 Suckless 永远不支持标签页),而且它非常可定制。
至于自定义,主要涉及字体、背景图片和配色方案。我通常使用Gruvbox 1 Dark 来完成大部分工作,不过我会根据具体情况覆盖一些设置。
可是等等。你可能会问,背景图片?在终端上?为什么?嗯,我正好有一篇关于这个的帖子:
Shell-zsh
我选择 zsh 是因为它是 Mac 上的默认语言。我知道,我知道:我其实不怎么用 Mac。但它几乎完全兼容 bash,满足我所有的需求,而且在我使用的所有系统上都可以使用。
我尝试使我编写的每个脚本都符合 POSIX 标准,如果我使用 BSD 和 GNU 之间的不同之处(例如sed -i
),我会将其包装在条件中。
公平地说,外壳的选择其实并不重要。
所以,在你说什么之前,我先声明,不,我不使用 oh-my-zsh。它没有提供任何我关心的、用 zsh(或者 bash)无法实现的功能。
哦,而且我几乎从不使用别名。
编辑器-Neovim
我使用 Vi/Vim 很久了,但一两年前换成了 Neovim。一开始我并不明白换用的意义,因为大家一直在讨论 Neovim 的所有功能(他们确实一直在讨论!——异步、LSP、嵌入式终端等等),要么在 Vim 的最新版本中也有,要么就是我根本不感兴趣的东西。我觉得这些东西根本不适合放在编辑器里。这些东西就是想把 Vim 变成 Emacs。
好吧,我还是会想这些烦人的事情,但我决定尝试几个 neovim 的“发行版”,看看有什么好用的,最后还是坚持用了它。装上插件后,它肯定比 Vim 的 bug 多,但对我来说,它仍然是一款好用又舒适的编辑器——而且它更有前途,尤其是在 Bram 已经离开(RIP)的现在。
生产率
多路复用
正如它一直以来的介绍,Tmux 是一个“终端多路复用器”,类似于 GNU Screen。它允许你关闭一个终端会话并重新打开它而不会丢失你的工作,并且允许你同时运行多个终端会话。
这样做的好处是,我可以把工作留在 MacBook 上,然后通过 SSH 从其他机器连接,这样一来,tmux attach
我就能立即回到工作的核心。我不需要每次都打开一堆会话,也不需要记住我当时在哪个目录,或者正在运行哪些服务,一切都在那里。
混频器
tmuxinator 项目是 tmux 的包装器,它允许您管理多个单独的 tmux 会话。
举个例子,下面是我目前在 MacBook 上运行的项目列表:
❯ tmuxinator ls
tmuxinator projects:
bc biascan ec fabric gce ifpma
leith leith-2023 msgan chickenland ngs ngs-new
ods ren renaissance scramble sf sf-cms
sf-forms sf-myplans sgh srn
这些项目都包含哪些内容?嗯……它们有很多细节,但归根结底,它们都与我随机挑选的这个项目类似:
windows:
- cms:
- ddev start
- storybook:
panes:
- watcher:
- cd web/storybook
- yarn watch
- middleware:
- workon mw8
- logs:
panes:
- cms:
- workon ngs
- docker exec -it ngs-cms-php drush -y --uri=ngs-cms.shore.signal.sh -r /shore_site/web ws --tail --full --extended --count=1
- new-cms:
- workon ngs-cms-2022
- docker exec -it ngs-cms-2022-app vendor/drush/drush/drush ws --extended
- middleware:
- workon mw8
- docker exec -it ngs-middleware-app vendor/drush/drush/drush ws --extended
- build-services:
panes:
- new-cms:
- workon ngs-cms-2022
- cd web/storybook
- yarn storybook
在这个例子中,我为 Drupal 7 项目配备了 tmux 窗口,重建了它的 Drupal 10,重建了一些共享中间件、前端构建服务、故事书服务器和大量日志记录。
我可以使用 来旋转这一切tmuxinator <project name>
,并使用 在其窗口集合之间切换,Ctrl-A <number>
并通过点击 弹出菜单切换到任意数量的完全不同的项目Ctrl-A S
。
德夫
Ddev 是一款可以让你为项目创建容器化(docker)环境的工具。它兼容 PHP、Node 以及(实验性地)Python。
基本上就是管理堆栈的东西。
我公司以前用的是自己开发的 docker-compose 包装器,那时候选择不多。不过 Ddev 确实很稳定,每次处理遗留或继承的项目时,我都会在检查无误后立即转换到 Ddev。转换过程通常不会花费很长时间,而且这意味着我们拥有一致的工作方式。例如,它可以让我们在 PHP 和 Node 版本之间快速轻松地切换。
对我来说它的一些主要卖点是:
- 使用Mutagen作为文件系统,因此即使在 MacOS 上也运行很快(众所周知,Docker 的挂载速度很慢)
- 轻松让您重新配置 PHP 和 Node 版本
- 了解大量第三方应用程序 - 例如,如果您有一个数据库 GUI 应用程序(如 TablePlus 或 DBeaver),您可以从命令行启动它
- 支持社区维护的附加组件
等等。很好。
图片来源:
《搬运杂货的男人》——DodgertonSkillhause
《协和式飞机驾驶舱的滑稽切换》——我。
《雕像》——lauramusikanski
《终结者2》中的场景》——抱歉,我听不见,我正在穿过一条隧道。
-
我按照拼写的方式发音 。↩