【问题标题】:How do you get a custom msbuild task to work properly?如何让自定义 msbuild 任务正常工作?
【发布时间】:2009-05-03 17:29:34
【问题描述】:

我有一个包含 2 个项目的 VS 2008 解决方案。项目 A 构建到项目 B(MVC 项目)使用的程序集中。我在项目 A 中创建了一个自定义任务,我在构建项目 B 时调用它。

我遇到了两个问题:

  1. 如果我的 AssemblyFile 属性指向项目 A 的 bin 目录,则一切正常。但是当我想清理项目B时,它总是给出无法访问项目A的程序集的错误,因为它正在被另一个进程使用(原来是devenv.exe)并且删除失败。
  2. 如果我的 AssemblyFile 属性指向项目 B 的 bin 目录,则构建失败,说它无法加载或找到项目 A 的程序集。我三重检查了路径、文件名、大写/小写、拼写,还检查了构建失败时项目 A 的程序集是否确实存在。

那么场景 1 和 2 有什么问题。或者我应该将 AssemblyFile 指向哪里?失败了,有没有更好的方法来做到这一点?

【问题讨论】:

  • 您好我只是想知道,是否有没有项目 B 的原因,取决于项目 A?如果您有一个解决方案文件,那么听起来所有这些工作可能都不是必需的,那么项目 B 依赖于项目 A。在解决方案/项目文件中记录依赖关系将有助于构建系统更有效地删除文件?我只是谨慎地不对您的实施做出假设。
  • 没错,我试过只使用一个程序集,但问题仍然存在。

标签: .net asp.net-mvc visual-studio-2008 msbuild


【解决方案1】:

如果你想独立构建这两个项目,那么你不能从它构建到的 VS 输出目录中引用“A”程序集...

我将如何处理这种情况:

在主干中我的项目文件夹的顶层创建一个依赖项文件夹..即:

  • ~/主干/依赖项
  • ~/trunk/projects
  • ~/trunk/projects/projectA
  • ~/trunk/projects/projectB

然后,在 projectA 的构建任务中,在构建完成后将程序集复制到 ~/trunk/dependencies 文件夹。

在 projectB 中,在 ~/dependencies 文件夹中引用该程序集(以便生成一个 .refresh 文件)

这将允许您随意清理项目B,并且“A”程序集将随时关闭。


对于 CI,我们使用 JetBrains TeamCity 并为我们的构建创建工件,然后构建任务根据需要引用这些工件。

【讨论】:

  • >那么你不能从 VS 输出中引用“A”程序集 >它构建到的目录...为什么不呢?在编译完所有程序集并复制到输出目录之后,自定义任务在构建过程之后完成。或者这只是另一个陷阱?我能找到的唯一没有问题的方法是将自定义任务放在单独的程序集中,程序集 C。我将 CruiseControl.NET 用于 CI。我对 TeamCity 进行了简短的了解,它的 UI 似乎要好得多。但目前,对于一个孤独的开发人员来说,CI 有点矫枉过正。
【解决方案2】:

有几种方法可以在项目中定义引用。

  1. 项目参考 - 这是一种更集成的方法,因为 VS 将为您确定构建顺序。因此,当您构建项目 B 时,VS 确定项目 B 依赖于项目 A,并将首先构建项目 A 并从其输出位置使用 A 的输出 dll。使用项目引用的缺点是,当您想将项目 B 包含在不同的解决方案中时,您还必须包含项目 A。

  2. 程序集引用 - 您还可以直接定义对程序集的引用。听起来这就是您正在使用的方法。在这种情况下,当您将项目 B 的文件引用设置为项目 A 的 /bin 中的 ProjA.dll 时,Visual Studio 不知道它必须首先构建项目 A 才能创建 ProjA.dll。您可以通过设置正确的“项目依赖关系”来指示 Visual Studio 首先构建项目 A。

为此,请在解决方案中同时加载 ProjA 和 ProjB。假设您已经拥有在场景 2 中定义的程序集引用,请右键单击项目 B 并选择“项目依赖项...”。在这里,您只需在列表中的项目 A 旁边打勾。现在,当您清理和构建解决方案时,VS 知道构建项目的顺序。

还需要注意的是,“构建顺序”和“项目依赖关系”是在解决方案级别定义的。因此,如果您使用定义为文件引用的依赖项目创建不同的解决方案,则必须为该新解决方案设置构建顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多