代码之家  ›  专栏  ›  技术社区  ›  sean

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

  •  1
  • sean  · 技术社区  · 16 年前

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

    我遇到了两个问题:

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

    那么场景1和场景2有什么问题呢。或者我应该将AssemblyFile指向哪里?如果做不到这一切,有没有更好的方法?

    2 回复  |  直到 16 年前
        1
  •  1
  •   datacop    16 年前

    如果您想独立地构建这两个项目,那么您不能从VS输出目录中引用“A”程序集,因为它是在VS输出目录中构建的。。。

    我将如何处理这种情况:

    在主干中“我的项目”文件夹的顶层创建依赖项文件夹。。ie:

    • ~/中继/依赖项
    • ~/主干/项目
    • ~/主干/项目/项目a
    • ~/主干/项目/项目B

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

    在projectB中,引用~/dependencies文件夹中的程序集(因此生成一个.refresh文件)

    这将允许您随意清理projectB,“A”程序集将在您喜欢的任何时候放下。


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

        2
  •  1
  •   nick    16 年前

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

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

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

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

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