Как удалить хэш из созданных Compass изображений изображений спрайтов?

Компас использует chunky_png для рендеринга спрайтов. Он добавляет хэш в конец файла, чтобы заставить кеши загружать новые спрайты изображений. Есть ли способ отключить этот кеш?

Ответы

Ответ 1

К сожалению, параметр asset_cache_buster :none не отключает добавление хэша в конец имени файла.

Как я уже писал несколько раз (на французском), Compass не имеет возможности отключить кеш-кеш, но я предлагаю решение.
В файле конфигурации (например, config.rb) добавьте следующие строки:

# Make a copy of sprites with a name that has no uniqueness of the hash.
on_sprite_saved do |filename|
  if File.exists?(filename)
    FileUtils.cp filename, filename.gsub(%r{-s[a-z0-9]{10}\.png$}, '.png')
  end
end

# Replace in stylesheets generated references to sprites
# by their counterparts without the hash uniqueness.
on_stylesheet_saved do |filename|
  if File.exists?(filename)
    css = File.read filename
    File.open(filename, 'w+') do |f|
      f << css.gsub(%r{-s[a-z0-9]{10}\.png}, '.png')
    end
  end
end

Теперь используется compass clean для удаления сгенерированных файлов и перезапуска компиляции с помощью compass compile.
Вы получаете, например, файл images/icons-scb1e5456d5.png file и a images/icons.png. В таблицах стилей все ссылки на спрайты теперь указывают на версию без хеша.

Обязательно сохраните файл, содержащий хэш, чтобы оптимизировать время компиляции компасом.

Ответ 3

Лучшее решение можно найти в другом аналогичном вопросе.

Это лучше, потому что:

  • Script изменяет имя перед генерированием спрайта - не после.
  • Из-за пункта 1. нет необходимости с трудом изменять .css автоматически сгенерированный файл. Он генерируется с правильным именем от начала.
  • Принятое решение делает cp (копия) сгенерированного спрайта с хешем, и он остается в файловой системе/репо как дубликат, что довольно плохо. Кроме того, он по-прежнему рассматривается как измененный с локальным репо, поэтому вы фиксируете два одинаковых файла. Решение могло бы сделать mv, чтобы сменить имя сгенерированного хеш файла, чтобы очистить его, но в этом случае sprite будет генерироваться каждый раз, когда вы используете его в файле .scss, так что это еще хуже.