Try   HackMD

upgrade macos 後進行修改

參考https://www.reddit.com/r/Nix/comments/11ynxa5/every_macos_update_needs_me_to_rerun_the_nix/?rdt=55449

sudo vi /etc/zshrc  
sudo vi /etc/bashrc

if [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ];
then
  . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'
fi

export PATH=~/.npm-global/bin:$PATH

注意事項

  1. 不要flake.nix/flake.lock 加入到 .gitignore 檔案中,會影響nix的操作和判斷。若這兩個檔案被ignore掉的話,當移除 .direnv 目錄時,就會顯示類似下面的錯誤訊息
error: path '/nix/store/sacajr708k6qiw5i701vpwrsb2ihxyin-source/flake.nix' does not exist

使用 Nix Flake 安裝 PHP 8.1 + xdebug

在 Nix Flake 中,您可以使用 phps 的 buildEnv 功能來創建一個包含所需擴展的 PHP 環境。

{ # 描述這個 flake 的用途 description = "A basic flake with a shell"; # nixConfig 設定額外的二進制快取(binary cache)來源 nixConfig = { # 添加 fossar 的快取服務器 extra-substituters = [ "https://fossar.cachix.org" ]; # 添加對應的信任公鑰 extra-trusted-public-keys = [ "fossar.cachix.org-1:Zv6FuqIboeHPWQS7ysLCJ7UT7xExb4OE8c4LyGb5AsE=" ]; }; # 定義此 flake 的依賴項 inputs = { # 使用 nixpkgs 的不穩定版本(最新版本) nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; # flake-utils 提供一些實用的函數 flake-utils.url = "github:numtide/flake-utils"; # nix-phps 提供 PHP 相關的包 phps.url = "github:fossar/nix-phps"; }; # flake 的主要輸出定義 outputs = { nixpkgs, flake-utils, phps, ... }: # 為每個預設系統創建配置 flake-utils.lib.eachDefaultSystem (system: let # 獲取系統特定的套件集合 pkgs = nixpkgs.legacyPackages.${system}; # 定義自定義的 PHP 環境 php = phps.packages.${system}.php81.buildEnv { # 配置 PHP 擴展 extensions = { enabled, all }: enabled ++ [ all.xdebug ]; # 添加額外的 PHP 配置 extraConfig = '' xdebug.mode=debug xdebug.start_with_request=yes xdebug.client_port=9003 ''; }; in { # 設定程式碼格式化工具 formatter = pkgs.alejandra; # 定義開發環境 shell devShells.default = pkgs.mkShell { # 指定需要的套件 packages = with pkgs; [ # 提供互動式 bash shell bashInteractive # 使用上面定義的 PHP 環境 php # 安裝 composer phps.packages.${system}.php81.packages.composer ]; }; }); }
  1. 使用 buildEnv 創建一個自定義的 PHP 環境。
  2. 在 extensions 中直接啟用 xdebug。
  3. 通過 extraConfig 直接設定 xdebug 的配置。

這樣的設置有以下優點:

  • 不需要手動指定 xdebug.so 的路徑
  • 配置更加集中和清晰
  • 減少了出錯的可能性
  • 更容易維護和管理

當您進入 shell 環境時,PHP 將自動包含已啟用的 xdebug 擴展和相關配置。

參考資料

  1. Nix 語言基礎
  2. Nixpkgs 基本概念
  3. Nix Flakes 概念
  4. Xdebug 配置知識
  5. buildEnv 使用方式

於 Laravel 使用 php artisan serve 時

XDEBUG_MODE=debug php artisan serve

這樣會:

  1. 在 9003 端口啟用 Xdebug
  2. 在 8000 端口啟動 Laravel 開發伺服器

確保你的 PhpStorm 已設置好監聽 Xdebug 連接(通常在右上角有個電話圖示),就可以開始除錯了。

在 PhpStorm 中設定 Xdebug 的步驟

  1. 開啟 PhpStorm 設定 (Settings/Preferences)
  2. 進入 PHP > Debug 頁面
  3. 確認 Xdebug port 設為 9003
  4. 進入 PHP > Servers
    • 新增一個 server
    • 設定 host name (例如 localhost)
    • 勾選 "Use path mappings"
    • 將專案根目錄對應到伺服器路徑
  5. 點擊工具列的 "Start Listening for PHP Debug Connections" 按鈕
  6. 在程式碼中設置斷點
  7. 啟動你的 PHP 應用程式

這樣就可以開始除錯了。當程式執行到斷點時,PhpStorm 會自動暫停並進入除錯模式。


在 .envrc 中設定 VSCode 參數,動態指定 PHP 路徑

編輯 .envrc

  1. 在你的專案目錄中,新增或編輯 .envrc,加入以下內容:
use nix export PHP_PATH=$(which php) # 自動生成 .vscode/settings.json(如果不存在) if [ -d ".vscode" ]; then if [ ! -f ".vscode/settings.json" ]; then echo "Generating .vscode/settings.json with PHP_PATH=$PHP_PATH" mkdir -p .vscode cat <<EOF > .vscode/settings.json { "php.validate.executablePath": "$PHP_PATH", "LaravelExtraIntellisense.phpCommand": "$PHP_PATH -r \\"{code}\\"" } EOF else echo ".vscode/settings.json already exists. Skipping generation." fi else echo ".vscode directory does not exist. Please create it manually." fi
  1. 允許 .envrc
    在專案目錄中執行以下指令來允許 .envrc:
direnv allow
  1. 注意事項
  1. .envrc 僅在有安裝 direnv 並允許後才會生效。
  2. PHP 路徑可能隨 Nix 配置改變,因此 .envrc 每次執行都會重新檢查 PHP 路徑。
  3. VSCode 需要重新啟動才能應用更新的 .vscode/settings.json。

使用 Nix 安裝 pinentry-mac 解決 GPG 簽署問題

使用 Nix 安裝 pinentry-mac

  1. 使用 nix-env 直接安裝
nix-env -i pinentry-mac

或者,如果你使用 nix-darwin 或 home-manager:

  1. 在 nix-darwin 配置中添加
    如果你使用 nix-darwin,編輯你的 configuration.nix
{ config, pkgs, ... }: { # 其他配置... environment.systemPackages = with pkgs; [ pinentry_mac # 其他套件... ]; programs.gnupg.agent = { enable = true; enableSSHSupport = true; }; }
  1. 在 home-manager 配置中添加
    如果你使用 home-manager,編輯你的 home.nix
{ config, pkgs, ... }: { # 其他配置... home.packages = with pkgs; [ pinentry_mac # 其他套件... ]; programs.gpg = { enable = true; settings = { use-agent = true; }; }; services.gpg-agent = { enable = true; defaultCacheTtl = 3600; maxCacheTtl = 7200; enableSshSupport = true; pinentryFlavor = "mac"; }; }

安裝後配置

安裝完 pinentry-mac 後,修改你的 GPG 配置:

  1. 編輯 ~/.gnupg/gpg-agent.conf
default-cache-ttl 3600 max-cache-ttl 7200 allow-loopback-pinentry pinentry-program $(which pinentry-mac)
  1. 重啟 GPG agent:
gpgconf --kill gpg-agent
  1. 測試是否正常工作:
echo "test" | gpg --clearsign

如果成功,你應該會看到 pinentry-mac 的圖形界面彈出請求密碼輸入。

其他相關 Nix 配置

如果你想進一步優化你的 GPG 體驗,可以在你的 Nix 配置中添加:

programs.gpg = { enable = true; mutableKeys = true; mutableTrust = true; settings = { use-agent = true; no-tty = true; batch = true; }; };