如何让自定义的msbuild任务正常工作?

时间:2009-05-03 17:29:34

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

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

我遇到过两个问题:

  1. 如果我的AssemblyFile属性指向Project A的bin目录,那么一切都运行良好。但是当我想要清理项目B时,它总是会出现错误,即项目A的程序集无法访问,因为它正被另一个进程使用(原来是devenv.exe)并且删除失败。
  2. 如果我的AssemblyFile属性指向Project B的bin目录,则构建失败,表示无法加载或找到Project A的程序集。我已经对路径,文件名,大写/小写,拼写进行了三重检查,并检查了当构建失败时项目A的程序集确实在那里。
  3. 那么方案1和2有什么问题。或者我应该在哪里指向AssemblyFile?如果做不到这一点,有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

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

我将如何处理这种情况:

在trunk中我的projects文件夹的顶层创建一个依赖项文件夹.. ie:

  • 〜/中继/依赖
  • 〜/中继/项目
  • 〜/中继/项目/了projectA
  • 〜/中继/项目/项目B

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

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

这将允许您随意清理projectB,并且随时可以关闭“A”组件。


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

答案 1 :(得分:1)

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

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

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

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

    同样重要的是要注意“构建顺序”和“项目依赖性”是在解决方案级别定义的。因此,如果您创建一个不同的解决方案,并将依赖项目定义为文件引用,则必须为该新解决方案设置构建顺序。