创建一个现成的 symfony 2 应用程序 zip

Posted

技术标签:

【中文标题】创建一个现成的 symfony 2 应用程序 zip【英文标题】:Creating a ready-to-use symfony 2 application zip 【发布时间】:2013-05-23 22:22:18 【问题描述】:

我创建了一个 symfomy 应用程序包,可用于从 android 应用程序收集崩溃报告(对于那些对 Android 和 ACRA 感兴趣的人:https://github.com/marvinlabs/acra-server)。

对此感到满意的人可以简单地将该应用程序作为常规 Symfony 2 包安装,方法是从 GitHub 获取它并执行所有需要的命令行操作但是我希望人们能够非常简单且无需安装该应用程序:

任何关于 symfony 的知识 需要访问 php composer 需要输入任何 php 命令行

为此,我打包了一个 zip 文件,其中包含整个 Symfony 代码 + 我的包。问题:似乎没有正确找到 CSS 和 javascript,我仍然需要在服务器上运行命令:

php app/console assetic:dump --env=prod --no-debug

问题 1:我怎样才能摆脱最后一步?

问题 2:总的来说,在制作 zip 文件之前,您会在我的流程中添加什么?


在制作该 zip 文件之前,我要做的是:

删除所有 git 文件夹 删除我的 app/config/parameters.yml 文件(特定于我的开发环境)

我还执行以下命令:

php app/console cache:clear --env=dev
php app/console cache:clear --env=prod
php app/console doctrine:schema:create --env=dev --dump-sql > create-schema.sql
php app/console doctrine:schema:update --env=dev --dump-sql > update-schema.sql
php app/console assets:install --env=prod --no-debug
php app/console assetic:dump --env=prod --no-debug

PS:

有演示:http://acra-server-demo.marvinlabs.com/dashboard Zip 文件在那里:http://www.vincentprat.info/tmp/acra-server-1.0.0.zip (17MB)

为想要尝试对其进行故障排除的人的安装说明:

    下载http://www.vincentprat.info/tmp/acra-server-1.0.0.zip 在您的服务器上上传 zip 内容 为目录 app/logs 和 app/cache 授予权限 777 从示例文件 app/config/parameters.yml.dist 创建文件 app/config/parameters.yml 借助文件 create-schema.sql 创建数据库表 使您的(子)域指向目录 acra-server/web 访问首页:http://www.example.com/dashboard

2013 年 12 月 6 日编辑

解压后的文件和权限列表

~/acra-server/web$ ls -l css
total 10
-rw-r--r--+ 1 vincentp users 8990 May 23 18:26 d82d504.css

~/acra-server/web$ ls -l js
total 103
-rw-r--r--+ 1 vincentp users 104721 May 23 18:26 7cb568e.js

资产转储命令后的文件和权限列表

:~/acra-server$ ls -l web/js
total 281
-rw-r--r--+ 1 vincentp users 205123 May 28 21:48 7cb568e.js
-rw-r--r--+ 1 vincentp users  21767 May 28 21:48 b96fe74.js

我们可以看到已经生成了另一个 JS 文件(CSS 也是如此)。我猜 Assetic 并没有从解压缩文件中寻找正确的文件。关于如何纠正的任何想法?也许强制资产使用给定的文件名?

【问题讨论】:

如果适合你,可以考虑使用capifony @cheesemacfly 不是一个选项,因为它需要再次使用命令行。我想坚持使用简单的 FTP 上传 + SQL 脚本。不过谢谢你的建议。 【参考方案1】:

html 是什么意思?您的资产路径是否正确生成?

我看到一个: "php 应用程序/控制台资产:安装 --env=prod --no-debug"

所以实际上 css 应该在那里。

也许你用你的网络目录试试这个命令。 将 CSS 从您的 Resources/Public 文件夹复制到您的 web/bundlename/...

“php 应用程序/控制台资产:安装网络”

还是一样?

【讨论】:

有Css,查看时链接在页面中,但不知何故安装后浏览器找不到。我无法理解。安装后再次运行assetic可以解决问题。什么是我的 zip 中没有的资产变化? 访问道具?它们可读吗?解压后你的文件结构如何?也许有从 zip 本身命名的新根文件夹? 用一些权限和观察编辑了我的问题:我们可以看到已经生成了另一个 JS 文件(CSS 也是如此)。我猜 Assetic 并没有从解压缩文件中寻找正确的文件。关于如何纠正的任何想法?也许强制资产使用给定的文件名?【参考方案2】:

如果它对您不重要,则可能根本不使用资产,也不会将所有资产文件合并为一个。您会失去所有功能,例如缩小、组合和其他功能。相反,您不再需要运行 php app/console assetic:dump --env=prod --no-debug

为此 - 运行 php app/console assets:install web。它将您的所有资产复制到web/bundles 文件夹。然后在base.html.twig 模板中,您可以手动包含您的资产。

% block stylesheets %
    <link href=" asset('bundles/mlabsacraserverbundle/stylesheets/style.css') " rel="stylesheet" media="screen">
    ...
% endblock %

% block javascripts %
    <script src=" asset('bundles/mlabsacraserverbundle/js/jquery.min.js')"></script>
    ...
% endblock %

这是解决问题的最简单方法。


其他方法是从 php 代码调用命令,如文档 here 和实时示例 here 中所述。您可以创建一个 install 页面,在其中运行此命令并安装资产。

【讨论】:

嗯,这真的是最后的机会。我宁愿让用户执行 php 命令。资产帮了我很多忙 :) 另一种方法是创建一个设置页面,您可以在其中脏 exec 命令,如 exec('php app/console assetic:dump --env=prod --no-debug'); 或更聪明的方式 symfony.com/doc/current/components/console/…【参考方案3】:

转储到给定的文件名

(assetic 的输出选项)

您可以将资产集合配置为转储到给定的文件名。这可以通过 output 选项在 twig 内部实现。不再有像 7cb568e.js 这样的自动生成的文件名。

例子:

% stylesheets 
    'bundles/mlabsacraserver/stylesheets/*' 
    filter='cs-s-rewrite'
    output='css/stylesheets.css'
%
    <link href=" asset_url " type="text/css" rel="stylesheet" />
% endstylesheets %

...或javascripts ...

% javascripts  
    'bundles/mlabsacraserver/js/jquery.min.js'
    'bundles/mlabsacraserver/js/*' 
    output='js/javascripts.js'
%
    <script src=" asset_url " type="text/javascript"></script>
% endjavascripts %

现在assetic 将使用给定的过滤器将您的资产转储到js/javascripts.jscss/stylesheets.css

assetic 转储这些资产的基本路径可以在您的 config.yml 中使用 assetic.write_to 和 defaults.to web/ 文件夹进行配置。

预配置的资产集合

您可以做得更好,让您的代码更有条理。 您可以在 config.yml(或其他导入的配置文件)中定义资产集合。

配置可以在 assetic.assets 下找到

例子:

# app/config.yml

assetic:
    # ...
    assets:
        js_main:
            inputs:
                - "bundles/mlabsacraserver/js/jquery.min.js"
                - "bundles/mlabsacraserver/js/*"
            output: js/javascripts.js

        css_main:
            inputs:
                - "bundles/mlabsacraserver/stylesheets/*"   
            filters: 
                - cs-s-rewrite                 # ...add more if you like
            output: css/stylesheets.css

现在您可以使用assetic 的asset() 函数和带有相应集合名称的@-syntax 在您的树枝模板中使用这些集合。

例子:

<link href=" asset('@css_main') " type="text/css" rel="stylesheet" />

...和...

<script src=" asset('@js_main') " type="text/javascript"></script>

通过这种方式,您可以配置assetic 应在何处查找您的资产,使用单个配置参数更改名称并将此逻辑保留在模板之外,使其更具可读性和更易于维护。

结果输出示例:

 <link href="/web/css/stylesheets.css" type="text/css" rel="stylesheet" />
 <script src="/web/js/javascripts.js" type="text/javascript"></script>

您现在在应用程序中有一个配置点,您可以在其中使用集合添加和删除资产,然后只需在模板中使用它们的引用名称。

对部署的进一步改进

您可以让您的用户输入他们的 mysql 主机、用户和密码,然后让 symfony 为您编写参数文件。

这是 symfony 标准版在您第一次访问应用程序时使用 SensioDistributionBundle 所做的事情。

执行parameters.yml实际写入的类是Sensio\DistributionBundle\Configurator\Configurator。

use Sensio\DistributionBundle\Configurator\Configurator;

现在使用安装控制器中的配置器。

   $configurator = new Configurator($this->get('kernel')->getRootDir());

   $configurator->mergeParameters(array(
        'my_parameter' = 'my_value',
        'my_parameter2' = 'my_value2',
   ));

  $configurator->write();

最好的办法是查看 Configurator 类本身以了解它的工作原理。

我现在可以拿赏金了吗? ;-)

【讨论】:

伙计,看来你对 symfony 了如指掌! :) 祝你好运!法比恩等着 :) 你可以成为第一个发布问题的人:) 让我们continue this discussion in chat 非常感谢您提供非常详细的答案。在奖励赏金之前,我将探索各种答案,这些答案将持续到下周:)【参考方案4】:

很抱歉,但是(我将再次谈到必须执行命令行)输入 7 个命令(下载/wget、unzip、chmod、cp、sql、config)比制作更简单

composer create-project marvinlabs/acra-server --prefer-dist acra-server

如果你添加一些post install scripts,你甚至可以自动配置网络服务器/ ...

例如,symfony-standard (https://github.com/Incenteev/ParameterHandler) 中的 composer 脚本执行 parametere.yml is already handled 的步骤。

我强烈建议不要使用 zip 文件,但如果您愿意,这里有一些链接可以解决您的资产问题:

使用static/fixed output name 分发prod assets

默认情况下,assetic 总是生成唯一的文件名,因此每个转储都是另一个文件名。

【讨论】:

您好,我们的想法是来输入任何命令。在共享主机上,composer 可能不可用(我的情况就是这种情况),您甚至可能没有对服务器的 SSH 访问以输入任何命令。因此需要一个 zip 文件。也就是说,我同意这两个程序都可以完成。最重要的是,我是 Symfony、Composer 的新手……所以我认为所有建议都很好。非常感谢您的意见。 只是为了比较,这里是symfony-standard的步骤:symfony.com/doc/current/book/…

以上是关于创建一个现成的 symfony 2 应用程序 zip的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2 网络套接字

Symfony 2.0 - 如何使用数组参数创建路由?

Symfony2 - 创建自己的供应商包 - 项目和 git 策略

通过 Symfony/Console 创建不同类型的类

symfony 应用程序与域/子域共享登录 cookie

Symfony 2.0 在实体内部获取服务