Как синхронизировать общий ресурс между проектами в MsBuild
Мне нужно синхронизировать доступ к общему ресурсу между проектами, встроенными в MsBuild. В прошлом, когда проекты выполнялись последовательно и в одном и том же процессе, это не было проблемой. Но теперь, когда MsBuild может запускать сборки проектов в нескольких потоках и нескольких процессах, я просто не могу найти способ добиться этого.
По сути, я хочу, чтобы, когда мои проекты начали собираться, я мог выполнить некоторую операцию над ресурсом. И когда все они построены до конца, я могу сделать еще одну операцию.
Если сначала подумать, что я могу реализовать пользовательскую задачу, и каждый проект должен изменить процесс сборки, введя задачу перед сборкой и после сборки. Но так как они могут работать параллельно и даже в разных процессах, мне кажется, что у меня нет выбора.
Когда я пытался это выяснить, то ближе всего я обнаружил класс BuildSubmission в пространстве имен Microsoft.Build.Execution (http://msdn.microsoft.com/en-us/library/microsoft.build.execution.buildsubmission..aspx). Но я не могу найти ничего о том, как я должен взаимодействовать с этими классами из моих пользовательских задач.
Любой тип ввода или указатели в каком-либо направлении будут высоко оценены!
/ Пер
1 ответ
Вы можете реализовать свой доступ к ресурсам в пользовательской задаче MSBuild и защитить ее с помощью именованного мьютекса (они могут использоваться для синхронизации отдельных процессов). Таким образом, реализация сначала получит мьютекс, проверит, нужно ли касаться ресурса или нет, и только затем она выполнит свою работу над ресурсом и, наконец, освободит мьютекс. Вы можете принудительно запустить эту задачу до или после сборки, используя AfterTargets или BeforeTargets.
Таким образом, если два проекта, использующих эту задачу, одновременно достигают стадии предварительной или последующей сборки, только один из них будет выполнять работу с ресурсом, пока другой ожидает. Когда первый проект освобождает мьютекс, второй получает его, понимает, что работа уже выполнена, и немедленно освобождает мьютекс, не касаясь ресурса.
Вам следует подумать, хотите ли вы использовать один и тот же мьютекс или два разных для доступа к ресурсам до и после сборки (могут ли они работать одновременно?).