Windows下Makefile执行Docker命令提示文件不存在问题
问题分析与解决方法
问题出在Makefile中指定的SHELL := /bin/bash导致路径解析异常:在Windows环境下,bash解析${PWD}会生成Unix风格路径(如/c/Users/xxx/project),而Docker挂载时无法正确将该路径映射到容器内的/local目录,手动在PowerShell执行时用的是Windows原生路径,所以能正常运行。
以下是几种可行的解决方法:
方案一:使用Make内置变量$(CURDIR)替换${PWD}
修改Makefile内容,利用Make的内置变量$(CURDIR)生成正确的绝对路径,同时给路径加引号避免空格问题:
SHELL := /bin/bash ENV_TYPE:=dev USER:=$(shell id -u) generate-client-win: docker run --rm -v "$(CURDIR):/local" openapitools/openapi-generator-cli generate -i /local/openapi.spec.yaml -c /local/openapi.config.yaml -g dart-dio -o /local/dart-dio-client
方案二:改用PowerShell作为Make的Shell
适配Windows原生环境,将Make的Shell设置为PowerShell,直接使用PowerShell的路径变量:
SHELL := pwsh.exe .SHELLFLAGS := -NoProfile -Command ENV_TYPE:=dev # PowerShell下获取当前用户SID替代Unix的id -u USER:=$(shell (Get-WmiObject -Class Win32_UserAccount | Where-Object { $_.SID -eq [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value }).SID) generate-client-win: docker run --rm -v "$(PWD.Path):/local" openapitools/openapi-generator-cli generate -i /local/openapi.spec.yaml -c /local/openapi.config.yaml -g dart-dio -o /local/dart-dio-client
方案三:强制获取Windows风格路径
在bash环境中通过cmd /c cd获取原生Windows路径,确保Docker能正确识别:
SHELL := /bin/bash ENV_TYPE:=dev USER:=$(shell id -u) # 获取Windows格式的当前工作目录 WIN_PWD:=$(shell cmd /c cd) generate-client-win: docker run --rm -v "$(WIN_PWD):/local" openapitools/openapi-generator-cli generate -i /local/openapi.spec.yaml -c /local/openapi.config.yaml -g dart-dio -o /local/dart-dio-client
调试验证(可选)
可以添加一个调试目标,查看路径变量的实际值,确认问题所在:
debug: @echo "bash下的PWD: ${PWD}" @echo "Make内置CURDIR: $(CURDIR)" @echo "Windows原生路径: $(WIN_PWD)"
执行make debug即可查看各路径的解析结果,验证是否和手动执行时的路径一致。
内容的提问来源于stack exchange,提问作者Biswas Khayargoli
相关产品推荐
相关产品推荐

