MAMP Pro是否支持自动虚拟主机?

3
使用MAMP Pro,您可以创建诸如“local.example.com”这样的条目,并指向本地计算机上该站点的根目录。
这是否可能自动化?
也就是说,在我的计算机上,我已经设置了如下内容:
User/hm/Sites/example.com/app User/hm/Sites/example2.com/app User/hm/Sites/example3.com/app 等等...
在app文件夹中,分别有每个域名的实际站点。
当然,我可以手动将它们添加到MAMP Pro中,并为每个相应的站点添加关联的url“example1.com”,“example2.com”,“example3.com”等。但我想知道是否有一种方法可以通过编辑MAMP Pro的虚拟主机模板来自动化此过程。因此,如果我在我的Sites文件夹中创建一个名为“example4.com”的新文件夹,并在其中放置一个WordPress网站的app文件夹,那么只要MAMP Pro正在运行,我就可以在浏览器中输入example4.com并查看该本地站点。
我看到MAMP(不是Pro)上有一篇文章http://wp.tutsplus.com/tutorials/hosting/wordpress-development-and-deployment-with-mamp-git-and-dropbox/,但是那篇文章仍然需要您手动将每个条目添加到您的主机文件中,这就失去了它的意义,因为我可以手动将其添加到MAMP Pro中。
1个回答

3
我曾经想过将命令行工具drush(用于管理drupal站点)与MAMP和MAMP Pro集成,从而实现自动创建虚拟主机进行测试。您手动添加到MAMP Pro的信息存储在文件〜/ Library / Preferences / de.appsolute.mamppro.plist中,然后使用它来修改/创建基于模板文件的/ etc / hostshttpd.conf文件。实际上,模板文件存储在〜/ Library / Application Support / appsolute / MAMP PRO / templates中,生成的文件存储在Library / Application Support / appsolute / MAMP PRO /中(检查此文件夹中的httpd.confhosts)。无论如何,编辑这些文件都没有意义,因为它们由MAMP每次保存手动修改并重新启动时生成(虽然我没有详细调查过,但我记得当我尝试手动编辑这些文件时,我已经没有希望了)。
你需要做的是直接编辑plist文件de.appsolute.mamppro.plist。可以使用PlistBuddy/usr/libexec/PlistBuddy参见man PlistBuddy)来读写plist文件。
你可以使用以下命令提取plist文件中的信息:
/usr/libexec/PlistBuddy -c Print ~/Library/Preferences/de.appsolute.mamppro.plist

使用此命令创建虚拟主机的典型(单个)记录如下:
    Dict {
        MultiViews = false
        documentRoot = /home/test/openpublish-2.3
        Order = 0
        ExecCGI = false
        serverAliases = Array {
        }
        dyndns = Dict {
            displayName = -
        }
        serverName = openpublish-2.3
        FollowSymLinks = true
        AllowOverride = 0
        local = true
        Allow = 0
        Includes = true
        Indexes = false
        SymLinksifOwnerMatch = false
    }

documentRootserverName是每个虚拟主机所需的主要值。如果您希望输出以xml plist形式呈现,则添加-x选项:

/usr/libexec/PlistBuddy -x -c Print ~/Library/Preferences/de.appsolute.mamppro.plist

以上单个记录是数组中的众多记录之一,该数组具有以下结构:
virtualHosts = 数组 { 字典 { ...虚拟主机1的值... } 字典 { ...虚拟主机2的值... } 字典 { ...等等... } }
上述命令会输出整个plist文件。只使用man页,要找出如何聚焦于virtualHosts数组或者说是virtualHosts数组中的第二个Dict(记录)是非常麻烦的。由于这篇关于操作Plists页面的帮助,我得到了解决方案(在下面的命令中,我跳过了/usr/libexec/部分):
要访问整个virtualHosts数组,请使用以下命令:
PlistBuddy -c "Print :virtualHosts" ~/Library/Preferences/de.appsolute.mamppro.plist

打印第二条记录:

PlistBuddy -c "Print :virtualHosts:2" ~/Library/Preferences/de.appsolute.mamppro.plist

要打印第五个virtualHosts记录的documentRoot

PlistBuddy -c "Print :virtualHosts:5:documentRoot" ~/Library/Preferences/de.appsolute.mamppro.plist

根据 man 页的说法,PlistBuddy -c Add entry type [value] 可以帮助你解决问题(即添加/写入所需记录),因此您可以将上述信息与 man 页和链接结合使用来解决问题(如果您想编写脚本,则链接很有用)。
我还没有完成我的自动化脚本(我更喜欢在 phpbash 脚本中使用 drush 代码),但我认为以下几点会对您有所帮助:
首先,如果您正在进行任何测试,请确保首先备份 de.appsolute.mamppro.plist 或复制此文件并在副本上进行所有测试。因此,在接下来的操作中,我假设您正在终端上,并已别名化命令并复制了 plist 文件,如下所示:
$ alias PlistBuddy="/usr/libexec/PlistBuddy"
$ cp ~/Library/Preferences/de.appsolute.mamppro.plist safe_to_play.plist

要将新的 Dict 添加到 virtualHosts 数组中:
PlistBuddy -c "Add :virtualHosts: dict" safe_to_play.plist

要找到新虚拟主机条目的索引,然后执行类似于以下内容的操作(假设为bash脚本):

PlistBuddy -c "Print :virtualHosts: dict" safe_to_play.plist  | grep documentRoot | wc -l

并添加 documentRoot 条目以创建此新记录:

PlistBuddy -c "Add :virtualHosts:XXX:documentRoot string /home/path" safe_to_play.plist

其中XXX是从预览命令中输出的行号(因为数组的索引从0开始)。

当然,您必须对所有条目(FollowSymLinksserverName等)重复此操作,确保尊重结构和类型(在单个Dict条目中有数组、整数和字符串)。最后但并非最不重要的是,必须重新启动MAMP Pro(或至少是服务器),以便更改在〜/Library/Preferences/de.appsolute.mamppro.plist中生效。再次备份您的plist文件!!!

我希望这可以帮助您制作所需的脚本。


2
嘿,感谢您提供这个精彩的答案!在 MAMP 3.x 中,vhosts 配置似乎已经移动了位置,您是否成功运行了您的脚本?谢谢! - Alex Weber
2
我还没有在MAMP 3.x上测试我的脚本。我的脚本是在做以下两件事情:a)备份de.appsolute.mamppro.plist b)添加一个新条目。这个操作很顺利!(对于错过/未回复您的评论感到抱歉!!!) - Symvan
@Symvan 感谢您详细的回答,真的帮了我很多。如果您在MAMP 3.x上实现它,或者有任何关于如何实现它的想法,您介意看一下我的问题吗?我列出了所有的发现:http://stackoverflow.com/q/33752919/1934402 - yaserso
我检查了这个问题 - 在我看来,您没有处于正确的plist文件中。请使用~/Library/Preferences/de.appsolute.mamppro.plist检查您的命令。 - Symvan
你正在查看正确的文件夹,但可能是错误的文件?- 我在那里添加了我的答案。 - Symvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接