DRY не является принципом MSBuild. С учетом вышесказанного не стоит повторяться в любом случае, когда этого можно разумно избежать. Ответ, который дал Аарон относительно дозирования, является хорошим. Это одно из средств предотвращения дублирования.
Одна вещь, на которую я хотел бы обратить внимание, заключается в том, что на более высоком уровне кажется, что вы думаете о MSBuild как о процедурном языке (т. Е. Имеете функции, которые вы можете вызывать, а что нет). MSBuild гораздо более декларативный, чем процедурный. Если вы создаете сценарии MSBuild и у вас есть мышление «Создайте функцию X, чтобы я мог вызвать ее в точке Y», то вы попадаете в мир боли. Вместо этого вы должны думать о MSBuild как о фазах. Например; собирать файлы, компилировать, публиковать и т. д. Когда вы думаете об этом таким образом, то имеет смысл понять, почему цели пропускаются после того, как они были выполнены один раз (, что вы, очевидно, наблюдали во время ваших испытаний ).
Кроме того, после того, как я так долго работал с MSBuild, я понял, что это действительно может быть PITA, чтобы делать вещи универсальным / универсальным способом повторного использования. Это можно сделать, но я бы зарезервировал этот тип усилий для файлов .targets, которые, как вы знаете, наверняка будут использованы повторно много раз. Теперь дни, вместо того, чтобы проходить через это, я гораздо более прагматичен, и я оказываюсь где-то между полностью хакерскими сценариями и действиями, которые я делал раньше. У меня есть набор сценариев, которые я использую повторно, но помимо них я стараюсь сделать все проще. Одна из главных причин этого заключается в том, что многие люди знакомы с основами MSBuild, но очень немногие знают об этом очень глубоко. Создание хороших общих сценариев требует глубоких знаний о MSBuild, поэтому, когда вы покидаете проект, человек, который приходит за вами, не будет знать, что вы делаете ( возможно, хорошо, если вы являетесь подрядчиком? Lol ).
В любом случае у меня есть куча ресурсов для пакетирования по адресу: http://sedotech.com/Resources#Batching.