在Laravel Homestead中为每个项目运行配置脚本


Run provisioning scripts per project in Laravel Homestead

我四处寻找,我找不到答案,可能是因为Homestead是如此的新,但我想知道:在Laravel Homestead,是否有一种方法可以让'流浪汉'通过在'Homestead中定义的每个项目的配置脚本运行。yaml文件?

要明确,我在Homestead中定义了一个项目。yaml,它有一个bash脚本,我需要运行它来简化设置。这可能吗?

也许,在项目根,有另一个Homestead。定义初始化流浪箱时要运行的bash脚本的Yaml文件?

或者是一个自定义编写的bash脚本,在每个项目的根目录中运行.sh文件?什么好主意吗?

根据isimmon的回答,以下是我如何为Homestead v2Homestead v1的早期版本创建一个工作项目特定的设置脚本

介绍:

我把我所有的项目都保存在我的homestead repo之外的一个projects文件夹中,这个文件夹名为projects:

<<p> 文件夹结构/strong>:
  • /outside-homestead/项目/myapp1,
  • /outside-homestead/项目/myapp2,
  • 等等…

在每个项目中,我都有一个名为provision的文件夹,其中包含子文件夹bash/outside-homestead/项目/myapp1/规定/bash

在每个bash文件夹中,我放置了一个包含命令的setup.sh文件:

  • outside-homestead/项目/myapp1/规定/bash setup.sh

#!/bin/sh
echo "==============================================="
echo "Project - DEPLOYMENT"
echo "==============================================="
echo "-----------------------------------------------"
echo "Project - Going down for maintenance."
echo "-----------------------------------------------"
php artisan down
echo "-----------------------------------------------"
echo "Project - Down for maintenance."
echo "-----------------------------------------------"
echo "Project - Composer is installing project."
echo "-----------------------------------------------"
composer install
echo "-----------------------------------------------"
echo "Project - Composer is updating project."
echo "-----------------------------------------------"
composer update
echo "-----------------------------------------------"
echo "Project - Composer is updating class autoload."
echo "-----------------------------------------------"
composer dump-autoload
echo "-----------------------------------------------"
echo "Project - Application is being optimized."
echo "-----------------------------------------------"
php artisan optimize
echo "-----------------------------------------------"
echo "Project - Artisan is migrating DB."
echo "-----------------------------------------------"
php artisan migrate --seed --force
echo "-----------------------------------------------"
echo "Project - Coming up from maintenance."
echo "-----------------------------------------------"
php artisan up
echo "-----------------------------------------------"
echo "Project - LIVE."
echo "-----------------------------------------------"

当然,您可以根据项目的复杂程度选择简单或复杂的部署文件。

在homestead安装的scripts文件夹中创建2个文件:project_setup.sh和server_setup.sh。文件project_setup.sh用于调用和运行项目特定的setup.sh文件。

脚本/projects_setup.sh

#!/bin/sh
cd $4
dos2unix $3
/bin/bash $3

server_setup.sh文件用于运行所有开发项目所需的通用命令,例如启用XDebug, nginx上传设置,数据库创建/设置(仅v1)和php配置。

脚本/server_setup.sh

#!/bin/sh
echo "============================================"
echo "Homestead - PROVISIONING"
echo "============================================"
env VAR='() { :;}; echo Bash is vulnerable!' bash -c "echo Bash is safe"
sudo apt-get update -y -q
sudo apt-get install php5-intl -y -q
echo "-------------------------------------------"
echo "Homestead - Enabling XDebug."
echo "-------------------------------------------"
echo ''n '                          >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.remote_port=9000'      >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.remote_mode=req'       >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.remote_host=127.0.0.1' >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.remote_handler=dbgp'   >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.remote_connect_back=1' >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.remote_enable=1'       >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.remote_autostart=0'    >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.max_nesting_level=400' >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.idekey=PHPSTORM'       >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.default_enable=1'      >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.cli_color=1'           >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.scream=0'              >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo 'xdebug.show_local_vars=1'     >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo ''n '                          >> /etc/php5/fpm/conf.d/20-xdebug.ini
echo "------------------------------------------"
echo "Homestead - Enabled XDebug."
echo "------------------------------------------"
etc....

接下来,您要确保在输入vagrant/homestead up时调用您的文件。为此,您需要稍微修改一下scripts/homestead。rb。查找这些行:

# Configure All Of The Server Environment Variables
if settings.has_key?("variables")
  settings["variables"].each do |var|
    config.vm.provision "shell" do |s|
        s.inline = "echo '"'nenv[$1] = '$2''" >> /etc/php5/fpm/php-fpm.conf && service php5-fpm restart"
        s.args = [var["key"], var["value"]]
    end
  end
end
# Update Composer On Every Provision
config.vm.provision "shell" do |s|
  s.inline = "/usr/local/bin/composer self-update"
end

在本节之后添加以下代码

# Custom Server provisioning
config.vm.provision "shell" do |s|
    s.inline = "dos2unix /vagrant/scripts/server_setup.sh"
end
config.vm.provision "shell" do |s|
    s.inline = "bash /vagrant/scripts/server_setup.sh"
end
# Custom Project provisioning
settings["sites"].each do |site|
  config.vm.provision "shell" do |s|
      s.path = "./scripts/project_setup.sh"
      s.args = [site["map"], site["to"], site["provisionScript"], site["appHome"]]
  end
end

Homestead 2可以在"后面添加自定义脚本。[HOME].homestead'after.sh文件。该文件用于在整个homestead配置过程结束后调用脚本,因此将在server_setup.sh和循环的project_setup.sh 已经运行之后运行。v1 &v2在宅基地。关于数据库的Yaml文件。您只需在Homestead.yaml:

中添加一个数据库列表,而不是在server_setup中放置数据库创建代码。
databases:
    - homestead
    - project1db
    - project2db

对于Homestead 2 &宅基地1剩下的宅基地。Yaml也是一样。要启用此"自定义",请将以下两个变量添加到Homestead.yaml的sites部分:

  • provisionScript
  • appHome
provisionScript变量是您的setup.sh文件在vagrant中的完整路径,而不是在您的桌面主机上。这使得事情与操作系统无关,而这正是虚拟机的目的。 appHome变量是项目的完整路径。您希望这个变量位于部署脚本之外,因为部署脚本的位置应该与服务器无关,并且这个变量是特定于Homestead的。基本上,你应该能够复制setup.sh的内容,说Laravel Forge的部署脚本编辑器(以及诸如此类的),而不需要改变内容(很多)。

Homestead的位置。Yaml是版本特定的:

  • 宅基地v2 =>(家里).homestead ' Homestead.yaml
  • 宅基地v1 =>/Homestead.yaml

Homestead.yaml

sites:
- map: vm.myapp1.local
  to: /home/vagrant/Code/myapp1/public
  provisionScript: /home/vagrant/Code/myapp1/provision/bash/setup.sh
  appHome: /home/vagrant/Code/myapp1
- map: vm.myapp2.local
  to: /home/vagrant/Code/myapp2/public
  provisionScript: /home/vagrant/Code/myapp2/provision/bash/setup.sh
  appHome: /home/vagrant/Code/myapp2

现在当你启动vagrant/homestead时,vagrant将运行server_setup.sh一次,并循环project_setup.sh来调用项目特定的setup.sh文件。

您将看到作为流浪运行的输出。因此,为了便于阅读和提供详细的文档,您需要划分每个活动的起始位置。一个值得收藏的好教程是:http://scotch.io/tutorials/php/getting-started-with-laravel-homestead

在scripts/homestead。看来您可以从homestead.yaml

访问站点地图。

使用下面的yaml文件'sites'部分

sites:
    - map: testapp.dev
      to: /home/vagrant/Code/testapp/public
    - map: testapp2.dev
      to: /home/vagrant/Code/testapp2/public

从"配置Nginx站点"部分如何在homestead中循环使用"map"answers"to"。在Yaml中,您可以将这些值传递给自己的脚本。

#test calling script and sending the site domain and dir path as args
    settings["sites"].each do |site|
      config.vm.provision "shell" do |s|
          s.path = "./scripts/foo.sh"
          s.args = [site["map"], site["to"]]
      end
    end

脚本/foo.sh

  #!/usr/bin/env bash
echo "site $1 is mapped to $2"
结果:

==> default: Running provisioner: shell...
    default: Running: C:/Users/lotus/AppData/Local/Temp/vagrant-shell20140525-3876-odm1f6.sh
==> default: site testapp.dev is mapped to /home/vagrant/Code/testapp/public
==> default: Running provisioner: shell...
    default: Running: C:/Users/lotus/AppData/Local/Temp/vagrant-shell20140525-3876-14jbkwm.sh
==> default: site testapp2.dev is mapped to /home/vagrant/Code/testapp2/public

我对shell脚本不够熟悉,无法提供任何进一步的信息,但似乎您可以将此作为起点。

更新:你也可以添加自己的参数到站点部分,并使用相同的方式

sites:
    - map: testapp.dev
      to: /home/vagrant/Code/testapp/public
      foo: "hello from foo"
    - map: testapp2.dev
      foo: "hello from foo 2"
      to: /home/vagrant/Code/testapp2/public

然后在homestead中通过s.args = [site["map"], site["to"], site["foo"]]。在foo.sh中将它们回显为arg 3" $3",这对于在每个站点的基础上做一些事情可能很有帮助。

给你

homestead halt && homestead up --provision