Makefile跨目标传递变量:如何获取poetry build生成的wheel包名
问题描述
假设现有如下内容的Makefile:
build: # output will be something like dist/foo-1.2.3-py3-none-any.whl poetry build upload: build aws s3 cp ${WHEEL_NAME} s3://some-bucket/
wheel包的名称会随版本更新动态变化,需要在build目标执行结束时记录生成的wheel包名,供upload目标读取调用,对应的正确实现方式如下:
实现方案
Make 每个目标的执行上下文是独立的 shell 会话,直接在 build 目标内定义的变量无法直接传递给 upload 目标,可根据场景选择以下两种实现:
方案1:直接匹配生成的wheel文件(单项目场景首选,最简便)
正常单项目执行poetry build只会在dist目录生成一个wheel包,直接用Make内置匹配函数获取即可,无需生成临时文件:
# 用=延迟展开,执行到变量调用时才会匹配文件,避免Make启动时dist目录为空匹配不到 WHEEL_NAME = $(wildcard dist/*.whl) # 执行build前先清理旧的构建产物,避免目录内有多个历史wheel包匹配错误 clean: rm -rf dist/* build: clean poetry build upload: build aws s3 cp $(WHEEL_NAME) s3://some-bucket/
方案2:写入临时文件记录名称(复杂场景适用)
如果你的场景会生成多个wheel包,需要明确取最新生成的版本,可以在build执行完成后将文件名写入临时文件,upload时读取即可:
clean: rm -rf dist/ .wheel_name build: clean poetry build # 取dist目录下最新生成的whl文件路径写入临时文件.wheel_name ls -t dist/*.whl | head -n 1 > .wheel_name upload: build # 读取临时文件内容作为上传路径 aws s3 cp `cat .wheel_name` s3://some-bucket/ # 可选:上传完成后自动删除临时文件 rm -f .wheel_name
内容的提问来源于stack exchange,提问作者Haterind
相关产品推荐
相关产品推荐

