---
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;
};
};
```