Могу ли я получить ссылку на текущий `ICakeContext` в моем скрипте сборки Cake?

Я занимаюсь рефакторингом сценария сборки Cake и решил ввести класс для хранения некоторых параметров сборки, которые часто передаются и/или существуют в глобальной области видимости.

Некоторые настройки берутся из аргументов и задаются с использованием синтаксиса Argument<T>(string name, string defaultValue).

Я хотел бы создать что-то вроде этого:

var context = BuildContext.FromArguments();

Для этого мне нужно получить экземпляр текущего ICakeContext. Я считаю, что причина этого в том, что все методы, определенные в сценариях торта, становятся методами специально созданного ICakeContext, который, вероятно, наследуется от CakeContext и, таким образом, может вызывать все его (расширенные) методы, но как только вы определяете класс, он становится вложенным. класс, у которого больше нет доступа к хорошим помощникам, таким как Argument<T>(name, defaultValue).

Я надеялся, что смогу либо сделать ICakeContext.Current, либо просто пройти this, как в BuildContext.FromArguments(this), или что-то подобное.

Но ключевое слово this не разрешено на этом уровне скрипта Cake (не знаю почему, является ли верхний уровень статическим методом?

Итак, вопрос: как мне получить ссылку на текущий ICakeContext?


person Michiel van Oosterhout    schedule 25.12.2017    source источник


Ответы (1)


Причина, по которой this не работает, заключается в том, как Roslyn реализует скрипты, и во внешней области скрипта нет концепции this.

Вы можете получить доступ к контексту несколькими различными способами.

От Task:

Task("MyTask")
  .Does(ctx =>
{
    BuildContext.FromArguments(ctx);
});

От Setup/Teardown:

Setup(ctx =>
{
    BuildContext.FromArguments(ctx);
});

Teardown(ctx =>
{
    BuildContext.FromArguments(ctx);
});

От TaskSetup/TaskTeardown:

TaskSetup(ctx =>
{
    BuildContext.FromArguments(ctx);
});

TaskTeardown(ctx =>
{
    BuildContext.FromArguments(ctx);
});

Из внешней области скрипта:

#load "somefile.csx"

BuildContext.FromArguments(Context);
person Patrik Svensson    schedule 25.12.2017
comment
Почему минус? Так как я написал код в Cake, я ОЧЕНЬ уверен, что он правильный... - person Patrik Svensson; 03.01.2018