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
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
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
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
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
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
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 generico
pero 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
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
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
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
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
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
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