我想执行一个命令,该命令在项目中获取特定文件(根据需要构建它)并将其发送到外部某处。例如,它可能是上传网页或发送电子邮件的命令。它甚至可能会写入一些额外的文件,例如日志,但这不是调用它的目的。
换句话说,这个动作是通过命名它的来源而不是目标来引起的——要么是因为没有切实的目标,要么它是微不足道的,而这个动作主要是因为它的副作用而需要的。
我看到必须提供一个额外的命令行参数,如下所示:
% BuildSystem send pizza.box
上面的命令应该等同于以下内容:
% BuildSystem pizza.box
% send pizza.box
可以(并且“应该”)使用shake
构建系统执行此操作吗?
PS正如丹尼尔在回答中建议的那样,我可以扩展shake
的参数解析器。但我不确定这是否是此类案例的最佳实践。它似乎与行为方式有点不一致shake
,将每个命令行参数都视为一个独立的目标。对于操作员来说,这也是一个全新的设计逻辑,对于这样一个卑微的任务来说,开销太大了。
receipt
为每个发送的文件请求一个文件可能更直观box
。例如:
% BuildSystem pizza.receipt
— 则相当于:
% BuildSystem pizza.box
% send pizza.box >pizza.receipt
不利的一面是,正如我从附近一个问题的官方回答中了解到的那样,我们不能有一个这样的伪目标pizza.send
,它实际上不会导致文件pizza.send
被创建。因此,我再次不确定这是否是正确的方法。
PS 2如果我们可以用自定义代码替换默认的“文件存在”成功验证器,那就更好了。例如,我们可能会打电话给客户并询问他们是否喜欢午餐,而不是验证确实创建了文件pizza.receipt
(否则我们不需要) 。如果我们可以安排,那么我们可以使用“伪文件”目标调用相应的规则pizza.send
。一般来说,构建工件根本不需要驻留在本地文件系统上,只要给出了可以验证和检索它们的代码即可。