我有一个非常具体的问题。我正在尝试分发一个python包(egg)并让开发人员的生活更轻松我已经开发了Makefile
。
我的发行版包含代码(Python源文件)和一些构建Dokumentation(HTML,PDF,...)。
因此,我在Makefile
:
doc/admin/html: doc/admin/src/*
echo "Build the HTML doc..."
doc/admin/pdf: doc/admin/src/*
echo "Build the PDF doc..."
doc: doc/admin/html doc/admin/pdf
$(PACKAGE).egg: doc/admin/html doc/admin/pdf src/*
echo "Build the egg..."
egg: $(PACKAGE).egg
到目前为止效果很好。一旦开发人员更改了源文件或文档,他/她就可以使用doc
目标和/或egg
目标的整个分发来重建文档。
现在我的问题:我有另一个目标test_egg
来测试分发。
目前我的目标定义如下:
test_egg: $(PACKAGE).egg
echo "Test the egg..."
此目标应由开发人员和CI执行。
问题是:在CI期间,$(PACKAGE).egg
文件将由另一个作业构建,然后传输到测试环境(我正在使用gitlab-ci)。因此,在此测试环境中,$(PACKAGE).egg
存在,但文档的doc/admin/html
和doc/admin/pdf
文件夹不存在。他们不需要这个目标,因为它们只是鸡蛋的中间文件。
我现在的问题是:如何定义test_egg
目标以使其执行
在$(PACKAGE).egg
存在时,不试图重建文档?
我知道,我可以将doc/admin/*
文件夹定义为INTERMEDIATE
,但这会阻止开发人员使用doc
目标构建文档。
感谢任何帮助!
答案 0 :(得分:0)
最好是避免将org.apache.spark.sql.catalyst.parser.ParseException:
Operation not allowed: STORED BY(line 1, pos 42)
声明为$(PACKAGE).egg
的先决条件。有几种方法可以做到这一点。
您可以使用make conditionals为test_egg
实例化不同的食谱:
test_egg
您可以在配方中使用make test_egg:
ifeq ($(wildcard $(PACKAGE).egg),)
$(error Ooops!)
else
echo "Test the egg..."
endif
功能:
if
您可以使用shell的条件:
test_egg:
$(if $(wildcard $(PACKAGE).egg),,$(error Ooops!))
echo "Test the egg..."
在所有情况下,如果test_egg:
[ -e $(PACKAGE).egg ] || { echo "Ooops!" && exit -1; }
echo "Test the egg..."
不存在,则$(PACKAGE).egg
目标将失败并显示错误消息。如果test_egg
存在,$(PACKAGE).egg
目标将会运行,但test_egg
将不会更新,即使它已过时。
使用示例:
$(PACKAGE).egg