我有这个 make 文件来检查文件是否存在于文件夹中。如果不是,它应该使用 curl 命令从 JFrog artifactory 下载该文件。如果文件存在那么它不应该做任何事情。
si_file := ms_auix
extract_path := C:\si
si_url := https://artifact.com/artifactory/aksi/SI/$(si_file).zip
.PHONY: download-si
download-si:
@echo "Checking for $(si_file) in $(extract_path)..."
@if not exist "$(extract_path)\$(si_file)" (
echo "Downloading $(si_file) from Artifactory...";
curl -u te14:cmVXluNkVJ -O "$(si_url)";
) else (
echo "$(si_file) already exists in $(extract_path).";
)
当我运行这段代码时,包是从 artifactory 下载的,但代码仍然运行 else 循环,我在终端中得到了这个
) else (
process_begin: CreateProcess(NULL, ) else (, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [Makefile:11: download-si] Error 2
if 循环工作正常,但为什么它无论如何都执行 else 循环。有人可以在这里指导我代码有什么问题吗?
对于多行命令,您需要转义换行符:
@if not exist "$(extract_path)\$(si_file)" ( \
echo "Downloading $(si_file) from Artifactory..."; \
curl -u te14:cmVXluNkVJ -O "$(si_url)"; \
) else ( \
echo "$(si_file) already exists in $(extract_path)."; \
)
这里可能的罪魁祸首是检查文件是否存在时缺少 .zip 文件结尾。
如果使用 GNU Make,你可以使用 order-only 依赖来创建不存在的文件:
download-si: | $(extract_path)\\$(si_file)
$(extract_path)\\$(si_file):
echo "Downloading $(si_file) from Artifactory...";
curl -u te14:cmVXluNkVJ -O "$(si_url)";
我可能会重新使用自动变量以及目标特定变量来将文件与 URL 相关联,而不是像那样替换全局变量。留给读者作为练习。