Win10 MinGW make环境Makefile如何存储PowerShell输出到变量
核心问题原因
- 你没有调用make的
shell函数执行命令,直接把命令字符串当值赋值,自然不会得到执行结果 - MinGW make默认使用cmd.exe作为执行shell,没有内置cp命令,所以触发命令不存在报错
- 如果你在makefile加载阶段就执行PowerShell命令,会出现新包还没构建就取值的问题,需要注意求值时机
方案一:使用make的shell函数动态取值(兼容原有写法)
在构建完package之后再执行PowerShell获取最新包路径,同时替换cp为Windows原生的copy命令避免环境依赖问题:
.PHONY: publish publish: clean build package ifeq ($(DEBUG), 1) @echo "Publishing a DEBUG package..." # 构建完成后动态执行PowerShell获取最新包路径 $(eval PKG_REL_PATH := $(shell powershell -NoProfile -Command "gci -Path . -File *.nipkg -Recurse -Name | sort creationtime | Select -First 1")) # 替换斜杠为Windows标准反斜杠,路径加引号避免空格问题 copy "$(subst /,\,$(ROOT_DIR)$(PKG_REL_PATH))" "$(subst /,\,$(TEST_FEED_REPO))" else @echo "Publishing a RELEASE package..." endif
方案二:直接在PowerShell中完成全部操作(更稳定,无跨进程传参问题)
不需要把值传给make变量,直接在PowerShell单进程内完成路径查找和复制操作,避免转义和求值时机问题:
.PHONY: publish publish: clean build package ifeq ($(DEBUG), 1) @echo "Publishing a DEBUG package..." # $$是make的转义符,用来声明PowerShell内的$变量 powershell -NoProfile -Command "$$pkg = gci -Path '$(ROOT_DIR)' -File *.nipkg -Recurse | sort creationtime | Select -First 1 -ExpandProperty FullName; Copy-Item $$pkg '$(TEST_FEED_REPO)' -Force" else @echo "Publishing a RELEASE package..." endif
可选优化:全局指定PowerShell为make的默认shell
如果你的整个构建流程都是基于Windows环境,可以在makefile开头添加如下配置,之后所有规则内的命令都会默认用PowerShell执行,不需要每次加powershell前缀:
SHELL := powershell.exe .SHELLFLAGS := -NoProfile -Command
内容的提问来源于stack exchange,提问作者Dzak
相关产品推荐
相关产品推荐

