代码之家  ›  专栏  ›  技术社区  ›  Johannes Rudolph

针对多个.NET版本构建系统

  •  3
  • Johannes Rudolph  · 技术社区  · 15 年前

    对于设计一个生成系统/项目结构,允许使用不同的功能集针对多个.NET版本,有哪些常见的做法?

    • 你应该从事源代码管理吗?
    • 你应该使用条件编译吗?
    1 回复  |  直到 15 年前
        1
  •  6
  •   Stephen Cleary    15 年前

    我试过几种不同的方法。

    我排除了分支,因为使用SVN/TFS保持所有分支的同步有点困难。分布式SCC确实对分支/合并有更高级的支持,所以如果我转换的话,我打算重新考虑这种方法。

    我使用条件编译以及使用链接源文件的版本特定项目。我在这方面做过的最具攻击性的库是 Nito.Linq currently targets 3.5、4.0、SL3和SL4,并且每个都有“带Rx”和“不带Rx”变体。我也有CF3.5工作,但VS2010不支持它。

    • 在我的解决方案中,我定义了一个“Sources”项目,作为文件的容器。不幸的是,它是在加载时生成的,卸载时我不能添加源文件;所以它最终会成为阻碍。
    • 链接针对不同框架的项目中的源文件会导致另一个问题:不可能在不同的项目中打开相同的源文件。VS将通知您这个事实,然后显示另一个项目中已经打开的源代码文件。这会影响IntelliSense,尤其是条件编译。不是一个显示停止,但很多时候你会打开一个文件,然后必须关闭它,并重新打开它(然后回到原来的位置)。
    • VS2010的单元测试必须针对4.0框架。因此,对其他框架版本的任何测试都必须以非VS2010的方式进行。我还没有找到解决这个问题的好办法;它不会影响Nito.Linq,因为对4.0变体进行单元测试会测试所有代码。

    Rx team 他们是如何处理这种情况的(他们支持3.5、4.0、SL3和SL4的代码库相同)。显然,他们使用一个自定义的内部工具来创建运行时程序集的纯元数据版本,然后将这些版本组合到包含合并的纯元数据程序集的超集概要文件中。项目是根据这个超集概要文件构建的,编译后的“重定目标”是用来将项目的概要文件更改为一个普通概要文件的。

    played around