【问题标题】:How to synchronize shared resource between projects in MsBuild如何在 MsBuild 中同步项目之间的共享资源
【发布时间】:2012-06-09 07:31:41
【问题描述】:

我需要在 MsBuild 中构建的项目之间同步对共享资源的访问。过去,当项目按顺序在同一流程中运行时,这不是问题。但是现在当 MsBuild 可以在多个线程和多个进程中运行项目构建时,我就是找不到实现这一点的方法。

基本上,我想要的是当我的项目开始构建时,我可以对资源进行一些操作。而当他们都建到最后,我可以再做一次手术。

如果首先想到我可以实现一个自定义任务并让每个项目修改构建过程,在构建之前和之后注入任务。但由于它们可以并行运行,甚至可以跨进程运行,我似乎无法选择。

当我试图弄清楚这一点时,我最接近的是当我在 Microsoft.Build.Execution 命名空间中找到 BuildSubmission 类时 (http://msdn.microsoft.com/en-us/library/microsoft.build.执行.buildsubmission.aspx)。但是我无法从我的自定义任务中找到任何关于我应该如何与这些类进行交互的信息。

任何类型的输入或某个方向的指针都将受到高度赞赏!

/每

【问题讨论】:

  • 您能更具体地说明您要共享的资源吗?可能还有其他解决方案。
  • 嗯,资源并不是真正的单一资源,但可以说它是一个用于说明的数据库。当构建属于共享解决方案的一组项目时,我想确保在构建之前,到达预构建注入点的第一个项目在这个数据库上做一些事情,并且所有后续项目都知道它已经完成,所以他们跳过做同样的事情。反之,当构建会话结束时:在构建最后一个项目之后,它会对数据库执行一些其他操作,也是独占的(其他项目不会)。
  • 我可以尝试用另一种方式来说明。我们让一个进程成为资源。我们有 X 项目的解决方案。构建解决方案时(在 MsBuild 之上使用 MsBuild 或 VS),我们要确保在任何项目开始构建之前,关闭一个进程(“Foo.exe”),并且在最后一个完成构建之后,我们要确保再次启动相同的过程。我们拥有所有 MsBuild 标准任务和制作自定义任务的选项供我们使用。我们可能希望通过修改 BuildDependsOn 属性在构建之前和构建之后注入我们的自定义任务。

标签: msbuild task synchronize


【解决方案1】:

您可以在自定义 MSBuild 任务中实现资源访问并通过 named mutex 保护它(这些可用于同步单独的进程)。也就是说,实现会首先获取互斥锁,检查资源是否需要被触动,然后才会对资源执行它的工作,最后释放互斥锁。您可以使用AfterTargets or BeforeTargets 强制此任务在构建之前或之后运行。

这样,如果使用此任务的两个项目同时到达预构建或构建后阶段,则只有其中一个将在资源上执行工作,而另一个则等待。当第一个项目释放互斥体时,第二个项目将获取它,意识到工作已经完成并立即释放互斥体,而不接触资源。

您应该考虑是否要使用相同的互斥体或两个不同的互斥体来进行预构建和构建后资源访问(它们可以同时运行吗?)。

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多