2016-08-04 5 views
3

У меня есть ряд задач, которые используют WithCriteria для указания, когда эта задача должна быть запущена. Этот критерий устанавливается в основном методе Setup сценария Cake. Однако, при выполнении сценария, я получаю пустую ссылку исключение ...Как я могу использовать глобальные переменные в `WithCriteria` моих задач для торта?

enter image description here

Как вы ГЭЭ, свойство Paths равно нуль, хотя в моем Setup методы я настройка, свойство.

Почему это?

Как я могу использовать глобальные переменные в пределах моего WithCriteria?

ответ

2

Проблема, с которой вы сталкиваетесь, заключается в том, что с использованием WithCriteria перегрузка, с которой вы используете критерии, оценивается до выполнения задачи.

В целом это нормально с константами/состояниями, созданными до выполнения задачи.

С WithCriteria имеет два перегружает one, которые вы используете выше

public static CakeTaskBuilder<T> WithCriteria(
     this CakeTaskBuilder<T> builder, 
     bool criteria 
) 

Как это занимает bool это оцененное как созданные задачи, которые не будет работать, если состояние создается & изменено во время установки или предыдущей задачи, для решения этого изменения вы код, чтобы использовать перегрузку below

public static CakeTaskBuilder<T> WithCriteria(
     this CakeTaskBuilder<T> builder, 
     Func<bool> criteria 
) 

Это перенагрузки принимает Func<bool> критерии Wh ich оценивается непосредственно перед выполнением задачи, таким образом, имеет доступ к любому состоянию, созданному или измененному до выполнения задачи.

Так что исправление для вашего вопроса, это просто добавить ()=> перед вашими критериями, и это будет ленивым загружены так:

Task("Test-NUnit") 
    .WithCriteria(()=>DirectoryExists(parameters.Paths.Directories.NUnitTestResults)) 
    .Does(()=> 
{ 
}); 
+0

Спасибо, работает точно так же, как описано! –