Git环境设置。建议需要

时间:2012-01-26 04:53:12

标签: mysql git lamp

背景资料:

  • 我们目前有3名网络程序员(现实生活中的好朋友,没有不信任问题)。
  • 每个程序员通过自己的用户名和sudo权力SSH进入代码所在的单个Linux服务器。
  • 我们一次都使用不同文件的工作。我们问的问题是“你在文件__?”有时。我们使用Vim,因此我们知道文件是否打开。
  • 我们的开发代码(尚未生产)位于/ var / www /
  • 我们的远程仓库托管在bitbucket上。
  • 我是Git的新手。我之前使用过subversion,但我基本上是用勺子喂食的指令,并且被告知确切地键入了什么来同步代码和提交。
  • 我读了大约一半的Scott Chacon的Pro Git,这就是我对Git知识的大部分了解。
  • 如果重要,我们运行Ubuntu 11.04,Apache 2.2.17和Git 1.7.4.1。

所以Jan Hudec在上一个问题中给了我一些建议。他告诉我这是一个很好的做法:

  • 每位开发人员都在自己的本地计算机上拥有自己的仓库。
  • 让/ var / www /成为服务器上的repo。将.git文件夹设置为权限770。

这意味着每个开发人员的计算机都需要拥有自己的LAMP堆栈(或者至少安装了Apache,PHP,MySQL和Python)。

代码主要是JavaScript和PHP文件,因此克隆它并不是什么大问题。但是,我们如何在本地管理数据库?

在这种情况下,我们只有两个表,在本地重新创建整个数据库很简单(至少对于测试而言)。但是在未来当数据库变得太大时,我们应该只是远程登录服务器上的MySQL数据库,还是应该只有一个“样本”数据用于开发和测试目的?

3 个答案:

答案 0 :(得分:4)

您所做的是从“每个人在一个环境中共同工作”转变为“每个人都有自己的发展环境”。主要的好处是每个人都不会踩到对方的脚。

其他好处包括异构开发环境,即如果每个人都在同一台机器上开发,那么软件将依赖于那个设置,因为开发人员很懒惰。如果每个人都在不同的环境中开发,即使只是略有不同版本的相同内容,他们也会被迫编写更强大的代码来处理它。

正如您所注意到的,主要缺点是设置环境更加困难。特别是,确保数据库正常工作。

首先,每个开发人员都应该拥有自己的数据库。这并不意味着他们都必须拥有自己的数据库服务器(虽然它有利于异构目的)但是他们应该拥有自己控制的数据库实例。

其次,您应该拥有架构,而不仅仅是数据库中的任何内容。它应该在版本控制的文件中。

第三,建立一个新的数据库应该是自动的。这使开发人员可以毫无困难地设置一个干净的数据库。

第四,您需要将有趣的测试数据导入该数据库。事情变得有趣......

你有几条路可以做到这一点。

首先是转储包含实际数据的现有数据库,当然要进行清理。这很容易,并且提供了真实的数据,但它非常脆弱。开发人员将不得不寻找有趣的数据来进行测试。这些数据可能会在下一次转储中发生变化,从而打破了他或者根本就不存在。

其次是写“测试装置”。基本上每个测试都使用所需的测试数据填充数据库。这样做的好处是允许开发人员准确获取他们想要的数据,并准确了解数据库所处的状态。缺点是它可能非常耗时,而且数据通常太干净了。数据不会包含可能导致实际错误的所有实际数据。

第三是根本不访问数据库,而是“模拟”所有数据库调用。您通常会查询通常查询数据库的所有方法,而不是返回测试数据。这就像编写测试夹具一样,并且具有大多数相同的缺点和好处,但它的FAR更具侵入性。除非你的系统是专门设计的,否则很难做到。它也从未真正测试数据库调用是否有效。

最后,您可以构建一组库,为您生成半随机数据。我在电子游戏之后称之为“模拟人生技术”,在那里你制造假家庭,折磨他们然后扔掉它们。例如,假设您有User对象需要名称,年龄,Payment对象和Session对象。要测试用户,您可能希望用户具有不同的姓名,年龄,支付能力和登录状态。控制生成名称,年龄,付款和会话的测试数据所需的所有内容。所以你编写了一个生成名称的函数和一个生成年龄的函数。这些可以像从列表中随机选取一样简单。然后你写一个让你成为Payment对象,一个是Session对象。默认情况下,除非另行指定,否则所有属性都是随机的,但有效。例如......

# Generate a random login session, but guarantee that it's logged in.
session = Session.sim( logged_in = true )

然后你可以用它来组建一个有趣的用户。

# A user who is logged in but has an invalid Visa card
# Their name and age will be random but valid
user = User.sim(
    session = Session.sim( logged_in = true ),
    payment = Payment.sim( invalid = true, type = "Visa" ),
);

这具有测试装置的所有优点,但由于某些数据是不可预测的,因此它具有实际数据的一些优点。将“有趣”数据添加到默认的sim和rand函数中会产生广泛的影响。例如,向random_name添加Unicode名称可能会发现各种有趣的错误!不幸的是,建立起来既昂贵又耗时。

你有它。不幸的是,数据库问题没有简单的答案,但我恳请你不要简单地复制生产数据库,因为从长远来看这是一个失败的主张。您可能会对所有选择进行混合:复制,固定,模拟,半随机数据。

答案 1 :(得分:1)

一些选项,按复杂程度增加:

  • 您全部连接到实时主数据库,读/写权限。这是有风险的,但我想你已经在做了。确保你有备份!
  • 使用测试夹具填充本地测试数据库并使用它。不确定在PHP世界中有什么工具。
  • 复制(mysqldump)master数据库并将其导入本地计算机的MySQL实例,然后设置dev环境以连接到本地MySQL。根据需要重复转储/导入
  • 设置从主服务器到本地实例的单向复制。

(可选)在主数据库上设置只读用户,并配置应用程序以允许您切换到与主数据库的只读连接,以防您无法等待主数据库的下一个副本数据

答案 2 :(得分:0)

  1. 自己的回购意味着拥有登台服务器(此配置难以维护,并且非常糟糕的扩展到10-20-100开发人员)
  2. 最好尽快(半)自动构建系统,将存储库存储的源数据转换为实时系统(减少手工操作 - 减少更改以产生非代码错误)和(也许)某种类型的Continuos集成(经常测试,快速发现bug)。对于构建系统(DB-part),您只需将初始数据(表结构,数据转储)准备为(版本化的)文本,这些文本是

    • 在合并之间轻松合并
    • 通过代码处理和处理并转换为最终可用对象,而不是手工处理 - 没有人为错误,没有操作干扰