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

Posted

技术标签:

【中文标题】如何以干净的方式分叉现有的 Meteorite 包?【英文标题】:How to fork an existing Meteorite package in a clean way? 【发布时间】:2013-08-08 09:59:57 【问题描述】:

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

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

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

步骤:

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

优点:

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

缺点:

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

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

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

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

接下来,您有三个选择:

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

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

步骤:

请参阅上面的链接了解如何初始化/创建/更新子模块 从您的smart.json 中删除包

优点:

子模块版本已连接到您的项目 更改立即生效

缺点:

所有开发者需要在第一次运行git submodule initupdate更新 编辑结帐时必须注意子模块的问题 阅读有关子模块的其他问题

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

步骤:

在您的smart.json 中,找到"router": 并在空的 中添加"git": "https://github.com/USER/meteor-router.git"。 (可选)添加"branch""tag"

优点:

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

缺点:

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

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

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

步骤:

将包克隆到项目之外的地方 与 2b 类似,将 "path" 添加到您的 smart.json 以将 Meteorite 指向您当地的结账处

优点:

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

缺点:

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

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

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

【问题讨论】:

感谢您的指导!既然 Meteor 有自己的包存储库,关于如何做到这一点的任何更新?谢谢! 这是 Meteor DX 体验中最糟糕的部分。 Npm 在这方面做得非常出色。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

对于 Meteor 1.0,我建议如下:

    设置本地包文件夹

    $ mkdir "$HOME/code/packages"
    

    PACKAGE_DIRS 环境变量添加到您的.bashrc/.zshrc 文件中

    export PACKAGE_DIRS="$HOME/code/packages"
    

    分叉并克隆存储库

    $ cd "$HOME/code/packages"
    $ git clone <yourGithubFork>
    

    从你的文件系统安装包

    $ meteor add <packagenamespace>:<packagename>
    

【讨论】:

这才是真正的答案 在使用 Mup 部署时,这与“包”文件夹方法(如下)相比如何?【参考方案4】:

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

例如:假设您想从流星中对accounts-ui-unstyled(这是accounts-ui 的sub-dependency)进行一些更改。将整个meteor source 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 中所做的任何更改现在都将覆盖该包。

【讨论】:

如果你想删除一个包的依赖,这是否有效?例如,我要修改的那个需要 jQuery UI。我想去掉这个要求,我可以覆盖它还是必须构建自己的包? 在此处放置一个名为 jQuery UI 的空项目可能会起作用。 在使用 Mup 部署时,这与 PACKAGES_DIR 方法(上图)相比如何? 不同之处在于上面会将包放入依赖项文件夹中,在那里它不会被覆盖。上述情况也会使设置断点和主动更改代码变得更加困难,因为每次发生更改时都必须进行流星添加。 谢谢康拉德和@GrantCermak。这很有帮助。我还可以确认该解决方案在 Windows 7 上的 Meteor 1.3 中有效。它也正确上传到我在 Galaxy 上的应用程序。为了添加更多细节,我在 .meteor/packages 中列出了原始大气包名称,但分叉版本(在 MyProject/packages 中)完美地超越了它,正如所愿! (不确定在 MyProject/packages 中列出名称的官方观点是什么。)

以上是关于如何以干净的方式分叉现有的 Meteorite 包?的主要内容,如果未能解决你的问题,请参考以下文章

既然 Meteor 0.6.0+ 支持 npm 包,Meteorite 还相关吗?

以干净的方式在 Asp.Net Core API 中实现 ProblemDetails 的最佳方法

Xampp:如何进行干净卸载以恢复旧的 MySQL 安装?

如何以编程方式填充现有的 PDF 文档 [关闭]

如何以编程方式将数据库添加到现有的 Always On 可用性组 (AOAG)?

如何以编程方式在 select2 多选下拉列表中添加其他选择而不会丢失现有的选定项目