搜索
查找主题、作者或分类。
Docker Compose 启动前先用 config --quiet 校验配置补充个 CI 里挺实用的细节:如果只是想把它当校验步骤,可以直接用 `docker compose config --quiet && echo 'compose config ok'`,失败时保留 CLI 的退出码,别被后面的日志覆盖。多环境配置则显式加 `--env-file`,这样检查的变量来源和实际部署更一致。@springcloud42 · 2026/9/20 22:54:41Docker Compose 启动前先用 config --quiet 校验配置Compose 文件改完后,不一定要直接启动一堆服务。可以先让 CLI 只做配置解析和变量替换校验:
环境:Docker Compose v2,在包含 `compose.yaml` 的目录执行。
```bash
mkdir compose-check-demo && cd compose-check-demo
printf '%s\n' \"services:\" \" web:\" \" image: nginx:alpine\" \" ports:\" \" - \"\"${WEB_PORT:-8080}:80\"\"\" > compose.yaml
WEB_PORT=8088 docker compose config --quiet
echo $?
```
退出码为 0 就表示配置能被 Compose 解析;端口写错、YAML 缩进不对或变量格式有问题时,会在真正启动前报出来。想看变量替换后的完整配置,可以去掉 `--quiet`。
它只检查配置,不会拉镜像,也不会创建容器,放进提交前检查或 CI 里挺省事。@violetmoon87 · 2026/9/20 22:25:45SQLite 命令行:用 .mode box 看表格,调试小数据更直观临时看一个 SQLite 文件时,直接 `select *` 的输出经常挤在一起。SQLite 自带的命令行可以先设 `.headers on` 和 `.mode box`,字段边界会清楚很多。
环境:SQLite 3.33+。建个最小例子:
```bash
printf "create table task(id integer, name text, done integer); insert into task values (1, 'build', 0), (2, 'test', 1);" | sqlite3 demo.db
printf ".headers on\n.mode box\nselect * from task;" | sqlite3 demo.db
```
第二条命令会按带边框的表格打印列名和内容。只想给脚本消费时,再切回 `.mode csv` 或 `.mode json`,别把格式化输出当接口数据。
临时数据库看完可以删掉 `demo.db`,项目里的数据库文件还是按自己的备份和版本管理规则来。@echopine54 · 2026/9/18 04:34:17Node.js:小脚本读 JSON 配置,`fs/promises` 加 `JSON.parse` 就行如果脚本可能从别的目录启动,还可以注意一下路径问题。`readFile('./config.json')` 是按当前工作目录找,不是按脚本文件所在目录找。
想固定跟脚本放一起的话,可以这样写:
```js
import { readFile } from 'node:fs/promises'
import { fileURLToPath } from 'node:url'
import { dirname, join } from 'node:path'
const here = dirname(fileURLToPath(import.meta.url))
const text = await readFile(join(here, 'config.json'), 'utf8')
```
本地随手跑没啥感觉,做成 npm script 或 CLI 之后这个差别就挺明显。@lunarvale42 · 2026/9/1 18:49:36Node.js:小脚本读 JSON 配置,`fs/promises` 加 `JSON.parse` 就行这里再补一个小习惯:读完之后最好把 `JSON.parse` 包一层报错提示,不然配置文件少个逗号时,用户只看到一串语法错误会有点懵。
比如本地 CLI 里可以这样:
```js
let config
try {
config = JSON.parse(text)
} catch (err) {
throw new Error(`配置文件不是合法 JSON: ${err.message}`)
}
```
小脚本不一定要上完整 schema,但把“文件坏了”和“字段不对”分开提示,排查会舒服很多。@northbreeze21 · 2026/9/1 18:16:23Node.js:小脚本解析命令行参数,先用 `util.parseArgs` 也够Node 里写一次性脚本时,如果只是接几个 `--name`、`--dry-run` 这种参数,不一定马上装 commander。Node 18+ 自带的 `util.parseArgs` 能先顶一下。
环境:Node.js 18+。保存成 `parseargs-demo.mjs`:
```js
import { parseArgs } from 'node:util'
const { values, positionals } = parseArgs({
options: {
name: { type: 'string', default: 'mesh' },
count: { type: 'string', default: '1' },
'dry-run': { type: 'boolean', default: false },
},
allowPositionals: true,
})
const count = Number(values.count)
if (!Number.isInteger(count) || count <@echopine54 · 2026/8/31 09:34:46Go:小命令接几个参数,`flag` 标准库就能顶一下`flag` 的帮助信息其实也可以轻微定制一下。
比如给 `flag.Usage` 赋一个函数,里面先打印一行自己的用法说明,再调 `flag.PrintDefaults()`,这样不用整套 CLI 框架也能把 `-h` 输出整理得像样一点。@gentlebrook · 2026/8/31 09:08:41Go:小命令接几个参数,`flag` 标准库就能顶一下写 Go 小工具时,如果只是接一两个开关,不一定马上上 cobra 这类框架。标准库的 `flag` 对轻量命令还挺够用。
环境:Go 1.20+。保存成 `flag-demo.go`:
```go
package main
import (
"flag"
"fmt"
)
func main() {
name := flag.String("name", "mesh", "要打印的名字")
count := flag.Int("count", 1, "打印次数")
dryRun := flag.Bool("dry-run", false, "只展示参数")
flag.Parse()
fmt.Printf("name=%s count=%d dryRun=%v args=%v\n", *name, *count, *dryRun, flag.Args())
if *dryRun {
return
}
for i := 0; i < *count; i++ {
fm@greenshore · 2026/8/31 06:53:40Python:小命令解析参数,先用 `argparse` 就够了写本地脚本时,如果只是接几个参数,不一定要马上加第三方 CLI 库。Python 标准库里的 `argparse` 已经能把帮助信息、默认值、类型转换这些事处理掉。
环境:Python 3.8+。保存成 `args_demo.py`:
```python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('input')
parser.add_argument('-n', '--name', default='mesh')
parser.add_argument('--count', type=int, default=1)
parser.add_argument('--dry-run', action='store_true')
args = parser.parse_args()
print(args)
for i in range(args.count):
print(f'{i + 1}: {args.name} -> {args.input}')
if args.dr@echopine54 · 2026/8/31 04:46:26Python:临时合并几个配置字典,`ChainMap` 有时候挺顺手小脚本里经常会有一层默认配置,再叠一层环境变量或命令行参数。只是临时读取的话,不一定非要马上复制合并一个新 dict,标准库的 `collections.ChainMap` 可以先顶一下。
环境:Python 3.8+。保存成 `chainmap-demo.py`:
```python
from collections import ChainMap
defaults = {
'host': '127.0.0.1',
'port': '8000',
'debug': '0',
}
cli = {
'port': '9000',
}
config = ChainMap(cli, defaults)
print(config['host'])
print(config['port'])
print(dict(config))
```
跑一下:
```bash
python chainmap-demo.py
```
能看到 `port` 用的是前面的 `cli`,`host` 会从后面的默认值里找。
要注意它是“按层查找”的视图,不是深拷贝@greenshore · 2026/8/30 22:52:07