0

我想执行一个命令,该命令在项目中获取特定文件(根据需要构建它)并将其发送到外部某处。例如,它可能是上传网页或发送电子邮件的命令。它甚至可能会写入一些额外的文件,例如日志,但这不是调用它的目的。

换句话说,这个动作是通过命名它的来源而不是目标来引起的——要么是因为没有切实的目标,要么它是微不足道的,而这个动作主要是因为它的副作用而需要的。

我看到必须提供一个额外的命令行参数,如下所示:

% 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。一般来说,构建工件根本不需要驻留在本地文件系统上,只要给出了可以验证和检索它们的代码即可。

4

2 回答 2

1

答案取决于您是想发送一次电子邮件还是重复发送电子邮件,即使pizza.box没有改变。在这两种情况下,让我们假设您想写信BuildSystem send.pizza.box以发送电子邮件。

每次发送

如果您想pizza.box每次都发送一份副本,您可以使用phony规则:

phony "send.pizza.box" $ do
    need ["pizza.box"]
    cmd_ "send-email" "pizza.box"

如果您希望它适用于所有文件,您可以概括为:

phonys $ \s -> case stripPrefix "send." s of
    Nothing -> Nothing
    Just file -> Just $ do
        need [file]
        cmd_ "send-email" [file]

发送一次

如果您只想pizza.box发送每个更改的一个副本,那么您需要在本地记录该证据,以停止发送连续的副本。最简单的方法实际上是创建一个文件send.pizza.box

"send.*" %> \out -> do
    let src = drop 5 out
    need [src]
    cmd_ "send-email" [src]
    writeFile' out ""

如果您强烈希望避免编写send.pizza.box文件,您可以phony结合使用上面的技术addOracle(但不太可能值得额外的麻烦)。

于 2019-05-01T10:14:55.463 回答
1

是的,shake 通过phony.

于 2019-04-30T19:42:19.087 回答