如何管理共享文件


How to manage shared files

我想找到最好的方法来管理和版本我们共享的文件。现在我们使用mercurial和TortoiseHG,这对于在一个项目中对所有文件进行版本化是很好的,但是我们想要从主存储库中单独处理一些文件。

我们使用codeigniter,我们有一些模型,库和视图文件,我们想在我们的项目之间共享,并将这些文件与其他存储库中的当前项目分开版本(或其他方式,例如使用包管理器-我不知道什么是最好的)。

换句话说,我们有项目A和项目B(我们有更多的项目,这只是举个例子)。当我们得到一个功能请求,这是一个一般的功能(更好的登录系统)从项目B的所有者,我们准备必要的改变,我们想要上传这个修改到所有其他项目。现在我们在当前项目中创建这些修改,我们正在这里工作。如果我们为这些共享文件创建另一个拥有自己的存储库的项目,这可能很难开发,因为这些文件不能单独工作,所以它们需要其他视图和控制器文件来加载和测试它们。

结构:

root/
  application/
    model/
      auth.php
      other1.php
      other2.php
    library/
      mail.php
      other1.php

我们希望auth。php和mail。php版本分开,而other。php-s从我们的任何项目上传到其他地方,检查这些单独的共享文件存储库中是否有任何更新如果有,那么更新这些文件在自己的项目中。

我到目前为止所尝试的:我在mercurial中创建了一个子存储库,但正如我所看到的,只有当我们将共享文件保存在单独的文件夹中时,它才能工作,这不是我们想要的。

对于subrepository,我们得到了这样的结构:

root/
  .hg/
    ...
  application/
    model/
      auth.php
      other1.php
      other2.php
    library/
      mail.php
      other1.php
  subrepo-files/
    application/
      model/
        auth.php
    library/
        mail.php

我希望你明白我在说什么,因为它越来越难治疗了。现在我们要做的是,当其中一个项目更新时,我们手动将这些共享文件复制到所有其他项目中。是的,这太可怕了!有时有人忘记将共享文件的更新版本复制到其他项目,当我们在共享文件的其他项目中创建其他更改时,然后将它们复制回其他项目,我们会丢失之前的更新(这是与自己的项目版本控制的,但我们发现得太晚了,我们不得不手动调试它们)。

我花了几天的时间来寻找最好的方法,但我没有找到我们想要的。

我想我明白了。在过去,我所做的是使用Composer和私有Composer存储库。使用Composer,你可以把你的共享代码打包成一个"模块"(或者你喜欢叫它什么)。

例如,我们有一个内部的DB模块和配置模块,我们到处使用。对于那些我可以管理和更新数据库或配置模块独立,然后包括他们在任何项目需要他们。

真正酷的部分是你可以版本你的Composer模块。这意味着每个加载该模块的应用只会导入该模块的一个特定版本。如果你更新了模块,其他应用程序仍在使用以前的版本,不会全部崩溃。

我知道这并不能解决如何开发和测试每个模块的问题,但是有一些选择。

Composer将在当前应用程序的vendor/目录中加载模块。一旦加载到你的应用程序中,你可以用一个符号链接把编译器加载的模块代码交换到你的模块分开的项目文件中,或者你可以在vendor目录中修改它们,然后将更改推送到Mercurial。

你也可以创建一个精简的测试/模拟版本的MVC应用程序,并在那里自动测试。