19

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

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

1. 只需将包文件复制到您的包文件夹中

脚步:

  • 消除packages/router/.git/
  • 编辑packages/.gitignore并删除“路由器”行
  • 从您的路由器中删除smart.json
  • 添加packages/router到您的项目存储库并提交
  • 现在进行更改(这样您的初始提交是一个干净的版本,您可以自己计算出您所做的更改)

好处:

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

缺点:

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

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

2.在github上fork,然后...

要在 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 来管理你的外部包
  • 将自动为其他开发人员和部署环境工作

缺点:

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

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

2c。在您的项目之外克隆并添加"path"smart.json

脚步:

  • 将包克隆到项目之外的地方
  • 与 2b 类似,在您的 to point Meteorite 中添加一个"path"到您smart.json的本地结帐

好处:

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

缺点:

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

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

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

4

4 回答 4

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>
    
于 2014-11-04T11:29:48.063 回答
5

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

例如:假设您想对来自流星的accounts-ui-unstyled(它是accounts -ui 的子依赖项)进行一些更改。将整个流星源的 git 克隆到本地存储库:

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 中所做的任何更改现在都将覆盖该包。

于 2015-01-16T20:27:47.923 回答
4

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

我会推荐这个版本,因为它最符合smart.json预期的使用和支持方式。mrt update将正确反映git repo我认为的最新情况。

于 2013-08-08T05:45:10.697 回答
0

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

有关示例,请参见https://github.com/mizzao/CrisisMapping 。就我而言,这些甚至都不是分叉,它们只是我正在开发的超越最新 Meteorite 版本的智能包。

于 2014-02-05T06:01:39.537 回答