Фальшивая цель для отправки файла по электронной почте?

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

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

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

% 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 (в котором нет необходимости), мы можем позвонить клиенту и спросить, понравился ли ему обед. Если мы сможем это устроить, то сможем вызвать соответствующее правило с целью "псевдофайл" pizza.send. Как правило, артефакты сборки вообще не обязательно должны находиться в локальной файловой системе, поскольку предоставляется код, который может их проверять и извлекать.


person Ignat Insarov    schedule 30.04.2019    source источник
comment
Вы можете написать любые правила для Shake, заменив верификатор успеха тем, что вам подходит. См. hackage.haskell.org/package/shake. -0.17.8/документы/   -  person Neil Mitchell    schedule 01.05.2019


Ответы (2)


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

person Neil Mitchell    schedule 01.05.2019

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

person Daniel Wagner    schedule 30.04.2019
comment
Я понимаю, что могу отправить один жестко закодированный файл, но я не уверен, как выбрать файл с аргументом командной строки. - person Ignat Insarov; 30.04.2019
comment
@IgnatInsarov Думаю, это довольно ортогональный вопрос, не так ли? Используйте любую библиотеку синтаксического анализа командной строки, которая вам нравится, затем want или need соответствующую вещь. - person Daniel Wagner; 30.04.2019
comment
Я посчитал, что shake по-своему работает с аргументами командной строки. Я использую его как main = shakeArgs shakeOptions $ do stuff. Я подумал, может быть, есть какая-то функциональность из коробки для обработки случая, как я описал. Или какая-то передовая практика. - person Ignat Insarov; 30.04.2019
comment
@IgnatInsarov shakeArgsWith позволяет вам подключать свои собственные данные к синтаксическому анализу командной строки встряхивания; или shakeOptDescrs позволяет вам подключить содержимое командной строки встряхивания к вашему собственному синтаксическому анализатору. - person Daniel Wagner; 01.05.2019
comment
Может быть, вы можете переместить этот совет в тело своего ответа? Чтобы оно обрело постоянство. - person Ignat Insarov; 01.05.2019
comment
@IgnatInsarov Вы задаете отдельный вопрос. Если вы хотите задать этот вопрос и ответить на него, сделайте это отдельным вопросом. - person Cubic; 01.05.2019