2012-06-09 4 views
2

MsBuild에 빌드 된 프로젝트간에 공유 리소스에 대한 액세스를 동기화해야합니다. 과거에는 프로젝트가 순차적으로 진행되고 동일한 프로세스에서 문제가 발생하지 않았습니다. 그러나 이제는 MsBuild가 여러 스레드와 여러 프로세스에서 프로젝트 빌드를 실행할 수 있으므로이 방법을 찾을 수 없습니다.MsBuild에서 프로젝트간에 공유 리소스를 동기화하는 방법

기본적으로 내가 원하는 것은 프로젝트를 빌드하기 시작할 때 자원에 대한 작업을 수행 할 수 있다는 것입니다. 그리고 그들 모두가 끝까지 지어 졌을 때, 나는 또 다른 작업을 할 수 있습니다.

먼저 사용자 지정 작업을 구현하고 모든 프로젝트에서 빌드 프로세스를 수정하고 빌드 전과 빌드 후 작업을 주입하도록 생각하면. 그러나 프로세스가 병렬로 실행될 수도 있고 프로세스간에 실행될 수도 있기 때문에 선택의 여지가없는 것처럼 보입니다.

이 문제를 해결하려고 할 때 가장 가까운 것은 Microsoft.Build.Execution 네임 스페이스 (http://msdn.microsoft.com/en-us/library/microsoft.build)에서 BuildSubmission 클래스를 발견했을 때였습니다. .execution.buildsubmission.aspx). 하지만 내 사용자 지정 작업에서 이러한 클래스와 상호 작용하는 방법에 대해서는 아무 것도 찾을 수 없습니다.

어떤 방향 으로든 입력이나 포인터의 모든 유형을 높이 평가할 것입니다!

/당

+0

공유하려는 리소스에 대해 자세히 설명해 줄 수 있습니까? 다른 해결책이있을 수 있습니다. –

+0

글쎄, 자원은 실제로 하나의 자원이 아니지만 설명을위한 데이터베이스라고 할 수 있습니다. 공유 솔루션에 속한 일련의 프로젝트가 빌드 될 때 빌드 전, 빌드 전 주입 지점에 도달 한 첫 번째 프로젝트가이 데이터베이스에서 작업을 수행하고 모든 후속 프로젝트가 완료되었음을 알기를 원합니다. 그래서 그들은 똑같이하는 것을 건너 뜁니다. 그리고 다른 방법은 빌드 세션이 끝날 때입니다. 마지막 프로젝트가 빌드 된 후에 데이터베이스에서 다른 작업을 수행하고 독점적으로 수행합니다 (다른 프로젝트에서는 수행하지 않음). –

+0

다른 방법을 설명하려고 시도 할 수 있습니다. 우리는 프로세스가 리소스가되도록합니다. 우리에게는 X 프로젝트가 포함 된 솔루션이 있습니다. 솔루션이 빌드 될 때 (MsBuild 위에 MsBuild 또는 VS 사용) 프로젝트를 시작하기 전에 프로세스 ("Foo.exe")가 종료되고 마지막 프로세스가 완료된 후, 우리는 동일한 프로세스가 다시 시작되도록 보장하고자합니다. 우리는 모든 MsBuild 표준 작업과 사용할 사용자 지정 작업을 수립 할 수있는 옵션을 제공합니다. BuildDependsOn 속성을 수정하여 빌드 직전과 빌드 직후에 사용자 정의 태스크를 삽입하려고합니다. –

답변

0

은 사용자 지정은 MSBuild 작업에 리소스 액세스를 구현하고 (이 별도의 프로세스를 동기화하는 데 사용할 수 있음) named mutex하여 보호 할 수 있습니다. 즉, 구현은 먼저 뮤텍스를 획득하고 리소스를 만져야하는지 여부를 확인한 다음 리소스에서 작업을 수행하고 마지막으로 뮤텍스를 릴리스합니다. AfterTargets or BeforeTargets을 사용하여이 태스크가 빌드 전후에 실행되도록 할 수 있습니다.

이 방법을 사용하면이 작업을 사용하는 두 프로젝트가 빌드 전 또는 빌드 후 단계에 동시에 도달하면 다른 프로젝트가 대기하는 동안 리소스 중 하나만 작업을 수행합니다. 첫 번째 프로젝트가 뮤텍스를 해제하면 두 번째 뮤텍스가 뮤텍스를 획득하고 이미 완료된 작업을 인식하며 리소스를 건드리지 않고 즉시 뮤텍스를 릴리스합니다.

사전 빌드 및 사후 빌드 리소스 액세스에 대해 동일한 뮤텍스를 사용할지 또는 두 가지를 사용할지를 고려해야합니다 (동시에 실행할 수 있습니까?).

관련 문제