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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:40:20