通过电子邮件发送文件的虚假目标?

A phony target for sending a file via e-mail?

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

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

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

% BuildSystem send pizza.box

上面的命令应该等同于下面的命令:

% BuildSystem pizza.box
% send pizza.box

(和"should")这可以用shake构建系统执行吗?


P.S. 作为 ,我可以扩展 shake 的参数解析器。但我不确定这是否是此类案例的最佳做法。这似乎与 shake 的行为方式有点不一致,将每个命令行参数都视为一个独立的目标。算子自己设计的也是一个全新的逻辑,这么小的工作开销这么大

为发送的每个 box 请求一个 receipt 文件可能更直观。例如:

% BuildSystem pizza.receipt

— 那么就等同于:

% BuildSystem pizza.box
% send pizza.box >pizza.receipt

不利的一面是,正如我从 了解到的那样,我们不能拥有像 pizza.send 这样的伪目标,它实际上不会导致创建文件 pizza.send。所以我再次不确定这是否正确。

P.S。 2 如果我们能用自定义代码替换默认的"file exists"成功验证器就更好了。例如,我们可以不验证文件 pizza.receipt (否则我们不需要) 确实已创建,而是可以打电话给客户并询问他们是否喜欢午餐.如果我们能安排好,我们就可以用 "pseudo-file" 目标 pizza.send 调用相应的规则。一般来说,构建工件根本不需要驻留在本地文件系统中,只要提供了可以验证和检索它们的代码即可。

是的,shake 通过 phony 支持此功能。

答案取决于您是要发送电子邮件一次还是重复发送,即使 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 结合使用(但这不太值得额外的麻烦)。