Лживая цель для отправки файла по электронной почте? - PullRequest
0 голосов
/ 30 апреля 2019

Я хотел бы выполнить команду, которая берет конкретный файл в проекте (строит его по мере необходимости) и отправляет его куда-то извне. Например, это может быть команда, которая загружает веб-страницу или отправляет электронное письмо. Он может даже записывать некоторые дополнительные файлы, такие как журнал, но это не имеет смысла вызывать его.

Другими словами, это действие вызывается наименованием его источника, а не цели - либо потому, что у него нет ощутимой цели, либо оно незначительно, и действие в первую очередь требуется для его побочного эффекта.

Я вижу, что необходимо указать дополнительный аргумент командной строки, например:

% BuildSystem send pizza.box

Команда выше должна быть эквивалентна следующей:

% BuildSystem pizza.box
% send pizza.box

Может ли (и "должен") это быть выполнено с помощью системы сборки shake?


P.S. Как Даниэль предлагает в ответе , я могу расширить парсер аргументов shake. Но я не уверен, что это лучшая практика для такого случая. Кажется, он немного расходится с поведением shake, рассматривая каждый аргумент командной строки как отдельную цель. Это также совершенно новая логика для оператора, так много накладных расходов для такой сложной задачи.

Возможно, было бы более интуитивно запрашивать файл receipt для каждой отправляемой box. Например:

% BuildSystem pizza.receipt

- тогда будет эквивалентно:

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

С другой стороны, как я понимаю из официального ответа на вопрос поблизости , у нас не может быть псевдо-цели, такой как pizza.send, которая фактически не приводит к созданию файла pizza.send. Поэтому я не уверен, опять же, если это правильный путь.

P.S. 2 Было бы еще лучше, если бы мы могли заменить стандартный «файл существует» верификатора успеха на собственный код. Например, вместо проверки того, что файл pizza.receipt (который в остальном нам не нужен) действительно был создан, мы можем позвонить клиенту и спросить его, наслаждались ли они обедом. Если мы можем это организовать, то можем вызвать соответствующее правило с помощью «псевдофайла» target pizza.send. Как правило, артефакты сборки вообще не обязательно должны находиться в локальной файловой системе, поскольку указан код, который может их проверять и извлекать.

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Ответ зависит от того, хотите ли вы отправить электронное письмо один или несколько раз, даже если 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 (но это вряд ли стоит дополнительных хлопот).

1 голос
/ 30 апреля 2019

Да, Shake поддерживает это через phony.

...