--- tags: 筆記, nix, nixos --- # 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` 目錄時,就會顯示類似下面的錯誤訊息 ```shell= error: path '/nix/store/sacajr708k6qiw5i701vpwrsb2ihxyin-source/flake.nix' does not exist ``` # 使用 Nix Flake 安裝 PHP 8.1 + xdebug ### 在 Nix Flake 中,您可以使用 phps 的 buildEnv 功能來創建一個包含所需擴展的 PHP 環境。 ```nix= { # 描述這個 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 語言基礎 - [https://nix.dev/tutorials/nix-language](https://nix.dev/tutorials/nix-language) - 了解 Nix 語言的語法和表達式 2. Nixpkgs 基本概念 - [https://nixos.org/manual/nixpkgs/stable/](https://nixos.org/manual/nixpkgs/stable/) - 了解套件管理和 derivations 3. Nix Flakes 概念 - [https://nixos.wiki/wiki/Flakes](https://nixos.wiki/wiki/Flakes) - 理解 flake.nix 的結構和用途 4. Xdebug 配置知識 - [https://xdebug.org/docs/](https://xdebug.org/docs/) - 了解除錯工具的設定方式 5. buildEnv 使用方式 - [https://nixos.org/manual/nixpkgs/stable/#sec-building-environment](https://nixos.org/manual/nixpkgs/stable/#sec-building-environment) - 了解如何組合多個套件 --- ### 於 Laravel 使用 php artisan serve 時 ```bash= 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 會自動暫停並進入除錯模式。 ### 在 VSCode 中設定 Xdebug 的步驟 1. 新增 `.vscode/launch.json` ```json= { "version": "0.2.0", "configurations": [ { "name": "Listen for Xdebug", "type": "php", "request": "launch", "port": 9003, "pathMappings": { "/var/www/html": "${workspaceFolder}" } } ] } ``` 2. 在現有的 .envrc 檔案中加入 Xdebug 設定: ```shell= "php.debug.ideKey": "VSCODE", "php.debug.port": 9003 ``` --- # 在 .envrc 中設定 VSCode 參數,動態指定 PHP 路徑 ## 編輯 .envrc 1. 在你的專案目錄中,新增或編輯 .envrc,加入以下內容: ### 版本 1 ```shell= 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 ``` ### 版本 2 ```shell= #!/bin/bash use flake export PHP_PATH=$(which php) SETTINGS_FILE=".vscode/settings.json" # 建立 .vscode 目錄 mkdir -p .vscode # 如果檔案不存在,直接建立 if [ ! -f "$SETTINGS_FILE" ]; then cat <<EOF > "$SETTINGS_FILE" { "php.validate.executablePath": "$PHP_PATH", "LaravelExtraIntellisense.phpCommand": "$PHP_PATH -r \"{code}\"", "php.debug.ideKey": "VSCODE", "php.debug.port": 9003 } EOF echo "Created $SETTINGS_FILE" else # 用 jq 新增或更新設定 tmpfile=$(mktemp) if jq \ --arg php_path "$PHP_PATH" \ --arg php_cmd "$PHP_PATH -r \"{code}\"" \ '.["php.validate.executablePath"] = $php_path | .["LaravelExtraIntellisense.phpCommand"] = $php_cmd | .["php.debug.ideKey"] = "VSCODE" | .["php.debug.port"] = 9003' \ "$SETTINGS_FILE" > "$tmpfile"; then mv "$tmpfile" "$SETTINGS_FILE" echo "Updated $SETTINGS_FILE" else echo "Error: Failed to update $SETTINGS_FILE" rm -f "$tmpfile" exit 1 fi fi ``` 2. 允許 .envrc 在專案目錄中執行以下指令來允許 .envrc: ```bash= direnv allow ``` 3. 注意事項 > 1. .envrc 僅在有安裝 direnv 並允許後才會生效。 > 2. PHP 路徑可能隨 Nix 配置改變,因此 .envrc 每次執行都會重新檢查 PHP 路徑。 > 3. VSCode 需要重新啟動才能應用更新的 .vscode/settings.json。 --- # 使用 Nix 安裝 pinentry-mac 解決 GPG 簽署問題 ## 使用 Nix 安裝 pinentry-mac 1. 使用 nix-env 直接安裝 ```shell= nix-env -i pinentry-mac ``` 或者,如果你使用 nix-darwin 或 home-manager: 2. 在 nix-darwin 配置中添加 如果你使用 nix-darwin,編輯你的 `configuration.nix`: ```= { config, pkgs, ... }: { # 其他配置... environment.systemPackages = with pkgs; [ pinentry_mac # 其他套件... ]; programs.gnupg.agent = { enable = true; enableSSHSupport = true; }; } ``` 3. 在 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) ``` 2. 重啟 GPG agent: ```shell= gpgconf --kill gpg-agent ``` 3. 測試是否正常工作: ```shell= 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; }; }; ```