Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Actualizando producción

21 de agosto de 2014

Hola, estoy actualizando mi aplicación en el servidor de producción, una vez actualizado uso estos comandos para actualizar los CSS y JavaScript:

$ php app/console cache:clear --env=prod 
$ php app/console assets:install
$ php app/console assetic:dump --env=prod --no-debug
$ php app/console cache:clear --env=prod

No me da error ni nada, me genera todos los archivos, pero al recargar la página me intenta cargar archivos con este nombre por ejemplo dfb8a10_part_1_bootstrap-theme_1.css?2, que era como se llamaban antes de actualizar. Pero ahora los que me genera se llaman 3b6903e_part_1_bootstrap-theme_1.css y por más que borro la cache con el comando o directamente borrando la carpeta de cache/prod/ no consigo que cargue los nuevos.


Respuestas

#1

Lo que me parece un poco extraño son las rutas que tienes en producción para esos archivos CSS y JavaScript. Recuerda en producción la idea no es usar Assetic directamente (como sí se hace en desarrollo) sino compilar todos los assets y combinarlos en un único archivo.

Para ello, en la configuración de producción tienes que tener esto:

# app/config/config_prod.yml
 
# ...

assetic:
    use_controller: false

Y en la plantilla del layout deberías tener algo como esto:

{% stylesheets
   filter="cssrewrite, ?yui_css"
   output="css/estilos.css"
   "%kernel.root_dir%/Resources/assets/lo-que-sea.css"
   "@MiPrimerBundle/Resources/public/lo-que-sea.css"
   "@MiSegundoBundle/Resources/public/lo-que-sea.css"
%}
    <link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}

Así en tus páginas acabarás con un único archivo CSS llamado estilos.css y que se encuentra directamente en <tu-proyecto>/web/css/estilos.css

@javiereguiluz

21 agosto 2014, 13:40
#2

Hola, he puesto lo que me has dicho, he vuelto a ejecutar los comandos y me genera esto en la pantalla:

14:46:03 [file+] /var/www/vhosts/mashware.es/httpdocs/escuela/app/../web/css/dfb8a10.css
14:46:03 [file+] /var/www/vhosts/mashware.es/httpdocs/escuela/app/../web/js/3b6903e.js
14:46:03 [file+] /var/www/vhosts/mashware.es/httpdocs/escuela/app/../web/css/b4463d0.css
14:46:03 [file+] /var/www/vhosts/mashware.es/httpdocs/escuela/app/../web/js/ff0c9d9.js
14:46:03 [file+] /var/www/vhosts/mashware.es/httpdocs/escuela/app/../web/js/3a29e72.js
14:46:03 [file+] /var/www/vhosts/mashware.es/httpdocs/escuela/app/../web/assetic/js/compiled/fmelfinder/main.js
14:46:03 [file+] /var/www/vhosts/mashware.es/httpdocs/escuela/app/../web/assetic/css/compiled/fmelfinder/main.css
14:46:03 [file+] /var/www/vhosts/mashware.es/httpdocs/escuela/app/../web/assetic/css/compiled/fmelfinder/main.css
14:46:04 [file+] /var/www/vhosts/mashware.es/httpdocs/escuela/app/../web/bundles/fmelfinder/js/main.js
14:46:16 [file+] /var/www/vhosts/mashware.es/httpdocs/escuela/app/../web/assetic/js/compiled/fmelfinder/main.js

Pero me devuelve esto:

<link rel="stylesheet" href="/css/estilos_part_1_bootstrap-theme_1.css?2">
<link rel="stylesheet" href="/css/estilos_part_1_bootstrap-theme.css_2.css?2">
<link rel="stylesheet" href="/css/estilos_part_1_bootstrap_3.css?2">
<link rel="stylesheet" href="/css/estilos_part_1_bootstrap.css_4.css?2">
<link rel="stylesheet" href="/css/estilos_part_2_frontend_1.css?2">
<link rel="stylesheet" href="/css/estilos_part_2_non-responsive_2.css?2">
<link rel="icon" type="image/x-icon" href="/favicon.png?2">

Te pongo el código que tengo puesto:

{% block stylesheets %}
    {% stylesheets 'bundles/bootstrap/generico/css/'
                   'bundles/bootstrap/frontend/css/'
                   filter="cssrewrite, ?yui_css" output="css/estilos.css" %}
        <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}
{% endblock %}

En el config.yml:

assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        [BootstrapBundle, BackendBundle, SliderBundle, FrontendBundle, FMElfinderBundle]
    java: /usr/bin/java #C:\Program Files (x86)\Java\jre7\bin\java.exe
    filters:
        cssrewrite: ~
        #closure:
        #    jar: "%kernel.root_dir%/Resources/java/compiler.jar"
        yui_css:
            jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
        yui_js:
            jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
        uglifyjs2:
            # the path to the uglifyjs executable
            bin: /usr/bin/uglifyjs
        uglifycss:
            bin: /usr/bin/uglifycss

@AlbertoVioque

21 agosto 2014, 14:45
#3

Tiene que estar pasando algo muy extraño que no logro ver. Lo que me descoloca del todo es que si ejecutas el siguiente comando:

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

Nunca deberías ver el listado individual de archivos CSS, tal y como indicas en tu anterior respuesta. Cuando añades el --no-debug, sólo se muestra una línea para el archivo final compilado que combina todos los archivos. Mira por ejemplo lo que me sale a mí cuando compilo los archivos de symfony.es:

$ php app/console --env=prod assetic:dump --no-debug
 
Dumping all prod assets.
Debug mode is off.
 
17:04:34 [file+] /Users/javier/sf/symfony.es/app/../web/css/frontend.css

Y si quito la opción --no-debug sí que veo todos los archivos CSS individuales.

Al margen de estos errores, ¿llega a generar Assetic el archivo css/estilos.css combinando todos los demás archivos?

@javiereguiluz

21 agosto 2014, 17:06
#4

No me lo genera con el nombre indicado en output="css/estilos.css" me genera estos dos archivos (uno el frontend y otro el backend): b4463d0.css y dfb8a10.css y va todo los CSS en esos dos archivos respectivamente.

Te pongo todo el archivo config:

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: "@BackendBundle/Resources/config/services.yml" }
 
framework:
    #esi:             ~
    #translator:      { fallback: "%locale%" }
    secret:          "%secret%"
    router:
        resource: "%kernel.root_dir%/config/routing.yml"
        strict_requirements: ~
    form:            ~
    csrf_protection: ~
    validation:      { enable_annotations: true }
    templating:
        engines:  ['twig']
        #assets_version: 2
    default_locale:  "%locale%"
    trusted_hosts:   ~
    trusted_proxies: ~
    session:
        # handler_id set to null will use default session handler from php.ini
        handler_id:  ~
    fragments:       ~
    http_method_override: true
    translator: { fallback: es }
 
# Twig Configuration
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
    form:
        resources:
            - 'BackendBundle:Form:fields.html.twig'
    globals:
        urlPatrocinadores: %uploads.patrocinadores.relativo%
        urlSlider: %uploads.slider.relativo%
        urlPublicidad: %uploads.publicidad.relativo%
        urlBlocks: %uploads.blocks.relativo%
        urlElcampo: %uploads.elcampo.relativo%
        urlHoyos: %uploads.hoyos.relativo%
        urlCorrespondencia: %uploads.correspondencia.relativo%
        urlOfertas: %uploads.ofertas.relativo%
        urlCategoriatarifas: %uploads.categoriatarifas.relativo%
        urlCompeticiones: %uploads.competiciones.relativo%
        urlNoticia: %uploads.noticia.relativo%
        urlProfesores: %uploads.profesores.relativo%
        urlInstalaciones: %uploads.instalaciones.relativo%
 
# Assetic Configuration
assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        [BootstrapBundle, BackendBundle, SliderBundle, FrontendBundle, FMElfinderBundle]
    java: /usr/bin/java #C:\Program Files (x86)\Java\jre7\bin\java.exe #/usr/bin/java
    filters:
        cssrewrite: ~
        #closure:
        #    jar: "%kernel.root_dir%/Resources/java/compiler.jar"
        yui_css:
            jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
        yui_js:
            jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
        uglifyjs2:
            # the path to the uglifyjs executable
            bin: /usr/bin/uglifyjs
        uglifycss:
            bin: /usr/bin/uglifycss
 
# Doctrine Configuration
doctrine:
    dbal:
        driver:   "%database_driver%"
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8
        # if using pdo_sqlite as your database driver, add the path in parameters.yml
        # e.g. database_path: "%kernel.root_dir%/data/data.db3"
        # path:     "%database_path%"

    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        entity_managers:
            default:
                auto_mapping: true
                mappings:
                    gedmo_translatable:
                        type: annotation
                        prefix: Gedmo\Translatable\Entity
                        dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity"
                        alias: GedmoTranslatable # this one is optional and will default to the name set for the mapping
                        is_bundle: false
                    gedmo_translator:
                        type: annotation
                        prefix: Gedmo\Translator\Entity
                        dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translator/Entity"
                        alias: GedmoTranslator # this one is optional and will default to the name set for the mapping
                        is_bundle: false
 
 
# Swiftmailer Configuration
swiftmailer:
    transport: "%mailer_transport%"
    host:      "%mailer_host%"
    username:  "%mailer_user%"
    password:  "%mailer_password%"
    spool:     { type: memory }
 
liip_imagine:
    resolvers:
       default:
          web_path: ~
 
    filter_sets:
        cache: ~
        my_thumb:
            quality: 75
            filters:
                thumbnail: { size: [200, 150], mode: outbound }
        el_campo:
            quality: 75
            filters:
                thumbnail: { size: [306, 207], mode: outbound }
        slider:
            quality: 75
            filters:
                thumbnail: { size: [300, 100], mode: outbound }
 
        instalaciones:
            quality: 75
            filters:
                thumbnail: { size: [306, 187], mode: outbound }
 
 
ivory_ck_editor:
    default_config: "my_config"
    configs:
        my_config:
            toolbar: "my_toolbar_1"
            uiColor: "#ffffff"
            extraPlugins: 'oembed,widget,lineutils'
            filebrowserBrowseRoute: elfinder
    plugins:
        oembed:
            path:     "/bundles/backend/ckeditor/plugins/oEmbed/"
            filename: "plugin.js"
        widget:
            path:     "/bundles/backend/ckeditor/plugins/widget/"
            filename: "plugin.js"
        lineutils:
            path:     "/bundles/backend/ckeditor/plugins/lineutils/"
            filename: "plugin.js"
    toolbars:
        configs:
            my_toolbar_1:
                - ['Source', '-', 'Preview', 'Print', '-', 'Templates']
                - ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo']
                - ['Find', 'Replace', '-', 'SelectAll', '-', 'Scayt']
                - '/'
                - ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']
                - ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl']
                - ['Link', 'Unlink', 'Anchor']
                - [ 'oembed', 'syntaxhighlight', 'Image', 'FLash', 'Table', 'HorizontalRule', 'SpecialChar', 'Smiley', 'PageBreak', 'Iframe']
                - '/'
                - ['Styles', 'Format', 'Font', 'FontSize', 'TextColor', 'BGColor']
                - ['Maximize', 'ShowBlocks']
fm_elfinder:
    editor: ckeditor
    compression: false
    connector:
        roots:
            uploads:
                path: uploads
white_october_breadcrumbs:
    separator:          ''
    viewTemplate:       "BackendBundle::breadcrumbs.html.twig"
 
stof_doctrine_extensions:
    default_locale: %locale%
    translation_fallback: true
    orm:
        default:
            translatable: true
            timestampable: true
            sluggable: true
 
be_simple_i18n_routing: ~

@AlbertoVioque

21 agosto 2014, 21:07
#5

Después de ver la configuración, sigo sin ver nada mal :( Si puedes probar una cosa, ¿podrías reemplazar el código original de tu plantilla Twig por lo que te pongo a continuación?

Tu código original

{% block stylesheets %}
    {% stylesheets 'bundles/bootstrap/generico/css/'
                   'bundles/bootstrap/frontend/css/'
                   filter="cssrewrite, ?yui_css" output="css/estilos.css" %}
        <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}
{% endblock %}

Nuevo código (aunque en realidad es lo mismo)

{% block stylesheets %}
    {% stylesheets
       filter="cssrewrite, ?yui_css"
       output="css/estilos.css"
       "%kernel.root_dir%/../web/bundles/bootstrap/generico/css/"
       "%kernel.root_dir%/../web/bundles/bootstrap/frontend/css/"
    %}
        <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}
{% endblock %}

@javiereguiluz

21 agosto 2014, 23:33
#6

Hola, perdón pero es que ayer no pude trabajar. Sobre la prueba que me has indicado, algo hemos avanzado pero no se si a bien o a mal jaja. Ahora me crea un archivo pero parece que lo del nombre output="css/estilos.css", se lo pasa a la torera, b4463d0.css, en el HTML generado busca en esta dirección css/estilos_css_1.css, pero falta el segundo archivo, no me lo genera, me genera el de genericopero no el de frontend

Si le quito el output="css/estilos.css" me crea el archivo b4463d0.css, y busca en b674a7c_css_1.css

Siempre me genera el archivo con el mismo nombre b4463d0.css, aunque lo borre se vuelve a crear con ese nombre.

En lo que me decías de que no debería decirme los archivos que va creando, lo sigue haciendo aunque diga esto en la pantalla (esto antes también me lo decía)

Dumping all prod assets.
Debug mode is off.
...

Te pongo mi composer para que veas versiones por si te sirve de algo:

{
    "name": "symfony/framework-standard-edition",
    "license": "MIT",
    "type": "project",
    "description": "The \"Symfony Standard Edition\" distribution",
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require": {
        "php": ">=5.3.3",
        "symfony/symfony": "2.4",
        "doctrine/orm": "~2.2,>=2.2.3",
        "doctrine/doctrine-bundle": "~1.2",
        "twig/extensions": "~1.0",
        "symfony/assetic-bundle": "~2.3",
        "symfony/swiftmailer-bundle": "~2.3",
        "symfony/monolog-bundle": "~2.4",
        "sensio/distribution-bundle": "~2.3",
        "sensio/framework-extra-bundle": "~3.0",
        "sensio/generator-bundle": "~2.3",
        "incenteev/composer-parameter-handler": "~2.0",
        "doctrine/doctrine-fixtures-bundle": "dev-master",
        "doctrine/data-fixtures": "dev-master",
        "liip/imagine-bundle": "dev-master",
        "knplabs/knp-menu": "2.0.@dev",
        "knplabs/knp-menu-bundle": "2.0.@dev",
        "whiteoctober/breadcrumbs-bundle": "dev-master",
        "stof/doctrine-extensions-bundle": "dev-master",
        "jms/serializer-bundle": "dev-master",
        "egeloen/ckeditor-bundle": "~2.0",
        "helios-ag/fm-elfinder-bundle": "1.*",
        "besimple/i18n-routing-bundle": "dev-master"
    },
    "scripts": {
        "post-install-cmd": [
            "Incenteev\ParameterHandler\ScriptHandler::buildParameters",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installAssets",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installRequirementsFile"
        ],
        "post-update-cmd": [
            "Incenteev\ParameterHandler\ScriptHandler::buildParameters",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installAssets",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installRequirementsFile"
        ]
    },
    "config": {
        "bin-dir": "bin"
    },
    "extra": {
        "symfony-app-dir": "app",
        "symfony-web-dir": "web",
        "incenteev-parameters": {
            "file": "app/config/parameters.yml"
        },
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}

@AlbertoVioque

23 agosto 2014, 12:48
#7

Sigo sin entender qué está pasando. Lo que sí que puedes hacer es ejecutar el siguiente comando para ver todas las opciones de configuración de Assetic. A ver si así vemos alguna opción con un valor que no debería tener:

php app/console config:dump-reference assetic --env=prod

En este listado me interesa sobre todo conocer el valor de las opciones read_from y write_to.

@javiereguiluz

23 agosto 2014, 13:17
#8

No me deja hacerlo en --env=debug dice:

[LogicException]
  Debug information about the container is only available in debug mode.

Por lo que se lo he quitado y esto es lo que sale:

# Default configuration for extension with alias: "assetic"
assetic:
    debug:                '%kernel.debug%'
    use_controller:
        enabled:              '%kernel.debug%'
        profiler:             false
    read_from:            '%kernel.root_dir%/../web'
    write_to:             '%assetic.read_from%'
    java:                 /usr/bin/java
    node:                 /usr/bin/node
    node_paths:           []
    ruby:                 /usr/bin/ruby
    sass:                 /usr/bin/sass
    variables:
 
        # Prototype
        name:                 []
    bundles:
 
        # Defaults:
        - FrameworkBundle
        - SecurityBundle
        - TwigBundle
        - MonologBundle
        - SwiftmailerBundle
        - AsseticBundle
        - DoctrineBundle
        - SensioFrameworkExtraBundle
        - BackendBundle
        - FrontendBundle
        - SliderBundle
        - BootstrapBundle
        - DoctrineFixturesBundle
        - LiipImagineBundle
        - KnpMenuBundle
        - WhiteOctoberBreadcrumbsBundle
        - StofDoctrineExtensionsBundle
        - JMSSerializerBundle
        - IvoryCKEditorBundle
        - FMElfinderBundle
        - BeSimpleI18nRoutingBundle
        - WebProfilerBundle
        - SensioDistributionBundle
        - SensioGeneratorBundle
    assets:
 
        # Prototype
        name:
            inputs:               []
            filters:              []
            options:
 
                # Prototype
                name:                 ~
    filters:
 
        # Prototype
        name:                 ~
    twig:
        functions:
 
            # Prototype
            name:                 ~

Por lo que veo es el default, estas son las que yo cambio en mi config:

assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        [BootstrapBundle, BackendBundle, SliderBundle, FrontendBundle, FMElfinderBundle]
    java: /usr/lib/jvm/
    filters:
        cssrewrite: ~
        #closure:
        #    jar: "%kernel.root_dir%/Resources/java/compiler.jar"
        yui_css:
            jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
        yui_js:
            jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
        uglifyjs2:
            # the path to the uglifyjs executable
            bin: /usr/bin/uglifyjs
        uglifycss:
            bin: /usr/bin/uglifycss

@AlbertoVioque

23 agosto 2014, 14:29
#9

He probado a cambiar esto:

assetic:
    debug:          "%kernel.debug%"

por esto:

assetic:
    debug:          false

y me lo hace bien, me genera los archivos y en el HTML los llama bien.

Pero queda la duda de ¿por qué? en teoría si estas en producción ese valor es falso ¿no?

@AlbertoVioque

23 agosto 2014, 17:51
#10

Me parece que ya se lo que puede estar pasando. El valor %kernel.debug% no se puede encerrar entre comillas, ya que al ser booleano, debe interpretarse como tal y no como cadena de texto.

Esto es lo que configuras en tu archivo config.yml:

assetic:
    debug:  "%kernel.debug%"  # cadena de texto
    debug:  %kernel.debug%    # valor booleano

Pero esto es lo que realmente se ejecuta en config.yml:

assetic:
    debug:  "false"  # cadena de texto
    debug:  false    # valor booleano

@javiereguiluz

23 agosto 2014, 17:55
#11

He probado a quitar las comillas y da el error que me estaba dando, por lo que eso no debe de ser, ademas que eso no lo he tocado y es algo que symfony me genero así, es más tengo todo el archivo de configuración con comillas todo.

Lo raro es que me de a mi solo jaja, pero la verdad que no se que puede ser.

@AlbertoVioque

23 agosto 2014, 18:20
#12

Me voy a corregir a mí mismo un comentario anterior, ya que no es cierto del todo. Si observas estos tests unitarios del componente Symfony/Yaml, verás que efectivamente no es lo mismo false que "false", ya que el primero acaba como un booleano de PHP y el segundo como una cadena de texto.

En cualquier caso, como es habitual utilizar el comparador simple (==) en vez del estricto (===), en la práctica suele dar igual utilizar un booleano o una cadena de texto.

@javiereguiluz

23 agosto 2014, 19:48