如何以干净的方式分叉现有的Meteorite包?

时间:2013-08-07 06:44:11

标签: meteor meteorite

我正在尝试找出在项目中在Atmosphere上分叉现有包的最佳/最干净的方法。我遇到过一些现有软件包需要进行一些修改的情况,我被迫分叉了。

据我所知,存在以下选项。不幸的是,所有这些都有自己的问题,我还没有找到完美的解决方案。我将以meteor-router为例:

1。只需将包文件复制到包文件夹

即可

步骤:

  • 删除packages/router/.git/
  • 修改packages/.gitignore并删除“路由器”行
  • smart.json
  • 中移除路由器
  • packages/router添加到项目存储库并提交
  • 现在进行更改(这样你的初始提交就是一个干净的版本,你可以自己解决你已经改变的事情)。

优点:

  • 易于实现和理解
  • 您所依赖的所有代码都可以在项目存储库中找到

缺点:

  • 您丢失了所有原始存储库历史记录
  • 很难更新到新版本
  • 很难将您的更改贡献回原始项目

除了最简单的包之外,甚至不要考虑这个!

2。叉在github上,然后......

要在github上分叉包,您可以检查smart.lock文件以查看正在使用的存储库。转到该存储库的github页面并进行分叉。

接下来,您有三个选择:

2a上。将其添加为git子模块

有关git子模块的更多信息:http://git-scm.com/book/en/Git-Tools-Submodules

步骤:

  • 请参阅上面有关如何初始化/创建/更新子模块的链接
  • smart.json
  • 中删除该包

优点:

  • 子模块版本已连接到您的项目
  • 立即选择更改

缺点:

  • 所有开发人员需要首次运行git submodule init并更新update
  • 编辑结帐时,您必须了解子模块的问题
  • 了解子模块的其他问题

2B。编辑项目的smart.json以使用您的版本

步骤:

  • smart.json中,找到"router": {}并在空"git": "https://github.com/USER/meteor-router.git"内添加{}
  • 或者,添加"branch""tag"

优点:

  • 您仍然可以使用Meteorite来管理外部包
  • 将自动为其他开发人员和部署环境工作

缺点:

  • 您的packages文件夹中的代码不可编辑,因为它不是git存储库
  • 每次运行时,陨石都不会自动更新到最新版本

(建议的陨石改进:允许以可编辑的形式安装软件包,比如Python的pip允许使用'-e'参数)

2c中。在项目外部克隆,并将"path"添加到smart.json

步骤:

  • 将包克隆到项目之外的位置
  • 与2b类似,在您的"path"添加smart.json,将陨石指向您当地的结帐

优点:

  • 您可以随意编辑包,Meteor会自动获取更改。

缺点:

  • 如果您提交此smart.json,则很可能会破坏所有其他开发/部署环境......

您使用哪种方法?你如何解决这种方法的缺点?

我可能错过了这些解决方案的一些问题。

4 个答案:

答案 0 :(得分:10)

对于Meteor 1.0,我建议如下:

  1. 设置本地包文件夹

    $ mkdir "$HOME/code/packages"
    
  2. PACKAGE_DIRS环境变量添加到.bashrc / .zshrc文件

    export PACKAGE_DIRS="$HOME/code/packages"
    
  3. 分叉并克隆存储库

    $ cd "$HOME/code/packages"
    $ git clone <yourGithubFork>
    
  4. 从文件系统

    安装软件包
    $ meteor add <packagenamespace>:<packagename>
    

答案 1 :(得分:5)

比上述所有方法都更容易回答。在项目中创建一个名为packages的目录,并将要覆盖的包放入其中。简单!

例如:假设您要对流星的accounts-ui-unstyledsub-dependency accounts-ui)进行一些更改。将整个meteor source的git clone复制到本地存储库:

MyMachine:~ theuser$ cd Development/
MyMachine:Development theuser$ git clone https://github.com/meteor/meteor.git
MyMachine:Development theuser$ cp accounts-ui-unstyled ~/Development/MyProject/packages

在您的项目结构中,您将拥有此

MyProject
 |
 -> client
 -> lib
 -> packages
    |
    -> accounts-ui-unstyled
 -> private
 -> public
 -> server
 -> tests

您在MyProject / packages / accounts-ui-unstyled中所做的任何更改现在都将覆盖该包。

答案 2 :(得分:4)

  

2B。编辑项目的smart.json以使用您的版本

我建议使用此版本,因为它与smart.json打算如何使用和支持的方式最为一致。 mrt update会正确反映我认为git repo的最新信息。

答案 3 :(得分:0)

我使用#2选项的混合:我将smart.json指向本地结帐,但我将所有包(包括应用程序和签出的智能包)作为git子模块放入父项目。陨石仍然在应用程序中安装其余的智能包。这样,当您开发智能包时,一切都保持一致,并且当您的fork合并时,您可以将应用程序移动到正常的Meteorite。

有关示例,请参阅 https://github.com/mizzao/CrisisMapping 。在我的情况下,那些甚至不是福克斯,它们只是我在最新的陨石发布之外开发的智能包。