
# CLI

`./vendor/bin/tailwindphp` 是 **PHP 移植版 [@tailwindcss/cli](https://github.com/tailwindlabs/tailwindcss/tree/next/packages/%40tailwindcss-cli)**，无需 Node.js。它接受相同的构建选项，但不包括源映射（`--map`），扫描内容的方式则不同：请参阅 [What the CLI scans](#what-the-cli-scans)。完成 `composer require tailwindphp/tailwindphp` 后，该二进制文件会链接到 `vendor/bin/`。

如果你只需要在运行时从 PHP 获取 CSS，请改用 [API](https://tailwindphp.inline0.dev/zh/docs/api)；CLI 适用于在构建步骤中将样式表写入磁盘的工作流。

## 快速开始

```bash
# Build CSS from an input file
./vendor/bin/tailwindphp -i ./src/app.css -o ./dist/styles.css

# Watch for changes and rebuild
./vendor/bin/tailwindphp -i ./src/app.css -o ./dist/styles.css --watch

# Build minified for production
./vendor/bin/tailwindphp -i ./src/app.css -o ./dist/styles.css --minify
```

## 选项

```bash
tailwindphp [-i input.css] [-o output.css] [--watch] [options…]
```

使用 `=` 为长选项指定值：`--input=./src/app.css`、`--output=./dist/styles.css`、`--cwd=/path/to/project`。长选项后以空格分隔的值（`--input ./src/app.css`）目前会被忽略且不报错，构建会回退到默认值（[#13](https://github.com/inline0/tailwindphp/issues/13)）。短选项会将下一个参数作为值（`-i ./src/app.css`）。

| 选项 | 说明 | 默认值 |
|---|---|---|
| `-i, --input` | 输入 CSS 文件；`--input=-` 从 stdin 读取 | `@import "tailwindcss"` |
| `-o, --output` | 输出文件 | `-` (stdout) |
| `-w, --watch` | 监听更改，并在需要时重新构建 | — |
| `-m, --minify` | 优化并压缩输出 | — |
| `--optimize` | 文档说明为“优化但不压缩”；目前会像 `--minify` 一样压缩（[#9](https://github.com/inline0/tailwindphp/issues/9)） | — |
| `--cwd` | 当前工作目录 | `.` |
| `-h, --help` | 显示用法信息 | — |
| `-V, --version` | 输出版本 | — |
| `-v, --verbose` | 构建失败时输出堆栈跟踪 | — |

当 `--output` 为 `-`（默认值）时，编译后的 CSS 会写入 stdout，因此你可以将其通过管道传给其他程序。进度消息（版本横幅和 `Done in …ms`）会写入 stderr。

与 `@tailwindcss/cli` 不同，这里没有 `--map` 选项：TailwindPHP 不会生成源映射。

## 输入 CSS

使用 Tailwind 导入、主题和指令创建 `app.css`：

```css
@import "tailwindcss";

@theme {
    --color-brand: #3b82f6;
}
```

## CLI 扫描的内容

CLI 中的内容扫描目前还不会像 `@tailwindcss/cli` 那样遵循 `@source`（[#8](https://github.com/inline0/tailwindphp/issues/8)）。在当前版本中：

- **输入 CSS 中没有 `@source` 文件指令时**，CLI 会递归扫描工作目录（`--cwd`）。这包括 `vendor/` 和 `node_modules/`；不会查询 `.gitignore`。
- **有一个或多个 `@source` 文件指令时**，CLI 会递归扫描**输入文件所在目录**。指令中的路径或 glob 不会生效：与 `src/app.css` 同目录的 `@source "../templates"` 会扫描 `src/`，而不是 `templates/`。
- **`@source not "…"`** 指令会被跳过；不会排除任何内容。
- **`@source inline("…")`** 和 **`@source not inline("…")`** 按文档所述正常工作，因为编译器会自行处理它们。

只会读取具有以下扩展名的文件：`php`、`html`、`htm`、`twig`、`blade.php`、`vue`、`jsx`、`tsx`、`svelte`、`astro` 和 `mdx`。类名取自 `class` 和 `className` 属性，与 [`tw::extractCandidates()`](https://tailwindphp.inline0.dev/zh/docs/api#twextractcandidates) 相同，因此只出现在 PHP 或 JavaScript 字符串中的类不会被发现。使用 `@source inline("…")` 强制包含这类类名。

在问题修复之前，可靠的配置是在要扫描的目录顶层放置一个输入 CSS 文件：

```css
/* templates/app.css: scans templates/ recursively */
@import "tailwindcss";
@source "./";
```

请参阅 [@source](https://tailwindphp.inline0.dev/zh/docs/usage/source)，了解指令语法，包括 `not` 和 `inline()` 形式。

## 示例

```bash
# Build from an input file
tailwindphp -i ./src/app.css -o ./dist/styles.css

# Build minified for production
tailwindphp -i ./src/app.css -o ./dist/styles.css -m

# Watch mode with minification
tailwindphp -i ./src/app.css -o ./dist/styles.css -w -m

# Run against a different working directory
tailwindphp -i app.css -o dist/styles.css --cwd=/path/to/project
```

如果输出目录不存在，CLI 会创建该目录；如果输入文件缺失，或输入与输出路径相同，则会报错退出。监听模式每隔 500 毫秒轮询输入文件和已扫描文件，并在其中一个文件发生更改或出现新文件时重新构建。

## 全局安装

全局安装后，即可从任意位置使用 `tailwindphp`：

```bash
composer global require tailwindphp/tailwindphp

# Now available globally
tailwindphp -i ./src/app.css -o ./dist/styles.css
```

请参阅 [入门](https://tailwindphp.inline0.dev/zh/docs/getting-started)了解项目设置，并参阅 [API](https://tailwindphp.inline0.dev/zh/docs/api)，了解如何从 PHP 生成运行时 CSS。
