You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Makefile目标中实现$(<some-file)等效功能且保留文件换行符

问题根因

你遇到的换行丢失问题是$(shell)函数的固有特性导致的:Make执行$(shell cat 文件名)读取文件内容时,会默认将输出中的所有换行符替换为单个空格,最终提交的YAML内容被拼接为单行,不符合语法规范触发校验报错。

解决方案

不要使用Make的$(shell)读取文件,将文件读取逻辑完全交给执行命令的Shell处理:对Makefile中需要透传给Shell的$符号,统一用$$转义即可,转义后Shell会按照你原本在终端执行的逻辑读取完整的文件内容,保留所有换行符。

完整可运行Makefile示例
# 定义GitLab CI文件路径,默认读取当前目录下的.gitlab-ci.yml
GITLAB_CI_FILE_PATH ?= .gitlab-ci.yml

# 声明lint为伪目标,避免和同名文件冲突
.PHONY: lint
lint:
	jq --null-input --arg yaml "$$(<$(GITLAB_CI_FILE_PATH))" '.content=$$yaml' | \
	curl "https://gitlab.com/api/v4/ci/lint" \
	--header "Content-Type: application/json" \
	--header "PRIVATE-TOKEN: $(GITLAB_PERSONAL_ACCESS_TOKEN)" \
	--data @-
注意事项
  • Makefile中目标下的执行命令必须使用Tab缩进,不能替换为空格,否则会触发Make语法错误
  • 私有令牌可以提前导出为环境变量export GITLAB_PERSONAL_ACCESS_TOKEN=你的令牌值,也可以执行命令时动态传入:make GITLAB_PERSONAL_ACCESS_TOKEN=你的令牌值 lint

内容的提问来源于stack exchange,提问作者adamcunnington

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:48:03