Как сгенерировать спрайты изображений в ember-cli с помощью компаса?

Обновление – 20140614:

Не получив ни ответов на этот вопрос, ни на github, я решил придумать собственное решение проблемы. Я использовал компас для нескольких целей, но его основная полезность заключалась в возможности генерировать спрайты изображений. Большинство других вещей можно было бы выполнить с помощью чистого SCSS.

Таким образом, я написал broccoli-sprite. Это, в сочетании со встроенной поддержкой SCSS в ember-cli с использованием broccoli-sass, позволило для удовлетворения моих потребностей.

НПМ

Вы можете узнать больше об этом здесь.

Таким образом, теперь я больше не заинтересован в интеграции компаса в мое приложение ember-cli. Поскольку мое решение не дает прямого ответа на вопрос (поскольку в нем не используется компас), я считаю этот вопрос оставшимся без ответа. Поскольку этот вопрос может принести пользу другим членам сообщества, которые захотят это сделать, я оставляю его открытым и все равно буду соблюдать награду!

Обновление – 20140620:

Срок действия награды истек.


Исходный вопрос:

В приложении ember-cli с помощью broccoli-compass, как его настроить таким образом, чтобы сгенерированный CSS правильно ссылался на пути к файлам изображений, включая пути к сгенерированным файлам изображений?

Используя компас, следующий SCSS:

@import"icon/*.png";
@include all-icon-sprites;

создаст один файл .png со всеми изображениями в папке icon и CSS для отображения каждого.

Я хотел бы сделать то же самое с помощью компаса в ember-cli, который использует broccoli для создания своего трубопровод активов.

  • Должен работать внутри ember-cli, то есть должен быть собран при запуске ember serve или ember build.
  • Необходимо использовать компас для создания спрайтов изображений из папки изображений.
  • Сгенерированные изображения следует скопировать в папку с ресурсами.
  • Сгенерированный CSS должен указывать на изображения, расположенные в папке ресурсов, а не на папку временного дерева.

Что я пытался до сих пор:

№1

app.styles = function() {
  var tree = this.appAndDependencies();
  return compileCompass(tree, {
    outputStyle: 'expanded',
    relativeAssets: false,
    sassDir: this.name+'/styles',
    imagesDir: 'public/images',
    // imagesDir: this.name+'/styles/images',
    cssDir: '/assets',
  });
};

Когда я это делаю, команда compass завершается ошибкой, потому что не может найти файлы изображений в дереве.

№2

app.styles = function() {
  var tree = this.appAndDependencies();
  return compileCompass(tree, {
    outputStyle: 'expanded',
    relativeAssets: false,
    sassDir: this.name+'/styles',
    // imagesDir: 'public/images',
    imagesDir: this.name+'/styles/images',
    cssDir: '/assets',
  });
};

Просто чтобы попробовать, я копирую файлы изображений в каталог стилей. На этот раз команда компаса выполняется успешно, но сгенерированный CSS ссылается на несуществующие файлы изображений. Сгенерированные изображения не копируются в папку ресурсов, как ожидалось (или куда-либо еще в этом отношении):

$tree tmp/output
tmp/output/
├── assets
│   ├── app.css
│   ├── app.js
│   ├── qunit.css
│   ├── qunit.js
│   └── vendor.css
├── images
├── index.html
├── testem.js
└── tests
    └── index.html

3 directories, 8 files

Подробности:

SCSS, который я хотел бы скомпилировать (для генерации спрайтов):

@import"compass/utilities/sprites";
$icon-layout: smart;
$icon-sprite-dimensions: true;
@import"icon/*.png";
@include all-icon-sprites;
@import"compass/css3/images";


person bguiz    schedule 06.06.2014    source источник
comment
Если возможно, было бы здорово, если бы вы могли опубликовать свое решение (ответив на свой вопрос), чтобы другие могли видеть его более четко, и поэтому вопрос выглядит ответом :)   -  person markthethomas    schedule 08.07.2014
comment
@markthethomas Спасибо за ваш комментарий, однако, к сожалению, решение, которое я выбрал, не соответствует требованиям этого вопроса. Я нашел способ создавать спрайты, но не использовать компас. См. мое обновление от 20140614: поскольку мое решение не дает прямого ответа на вопрос (поскольку оно не использует компас), и этот вопрос может принести пользу другим членам сообщества, которые хотят это сделать, я оставляю это открытым и по-прежнему буду соблюдать щедрость!... Я до сих пор считаю этот вопрос без ответа, и решение все еще на свободе!   -  person bguiz    schedule 09.07.2014
comment
Спасибо за разъяснения :)   -  person markthethomas    schedule 09.07.2014
comment
Какой! 250, я ответил на это более недели назад. Имейте какой-то смысл.   -  person eguneys    schedule 28.07.2014


Ответы (2)


Трудный путь

Добавьте в свой brocfile

var app = new EmberApp({
    compassOptions: {
        imagesDir: 'public/assets'
    }
});

а затем импортировать значки

@import "compass/utilities/sprites";
@import "icons/*.png";

$icons-sprite-dimensions: true;
@include all-icons-sprites;

и перезаписать путь

.icons-sprite {
    background-image: url('/assets/icons-sea02d16a6c.png');
}

Более элегантный способ

Настройте компас для использования определенного каталога

@import "compass/utilities/sprites";
@import "compass/configuration";

$compass-options: (http_path: "/", generated-images-path: "public/assets", http-generated-images-path: "/assets", images-path: "public/assets");

@include compass-configuration($compass-options);

@import "icons/*.png";
$icons-sprite-dimensions: true;
@include all-icons-sprites;

Это не идеальное решение, хотя оно работает. Конфигурация не должна храниться в .scss файлах. К сожалению, эти опции внутри brocfile не будут работать.

person Mateusz Nowak    schedule 19.03.2015

Я думал, что это будет решено с помощью аддона ember и хука постобработки, я опубликовал аддон,

Для установки запустите: npm install ember-cli-compass --save-dev внутри вашего проекта.

Настройте в своем Brocfile.js.

/* global require, module */

var EmberApp = require('ember-cli/lib/broccoli/ember-app');

var app = new EmberApp({
    compass: {
        outputStyle: 'expanded',
        relativeAssets: false,
        sassDir: 'assets',
        imagesDir: 'images',
        cssDir: 'assets'
    }
});

module.exports = app.toTree();

Кажется, это делает то, что вы хотите, но я не уверен. Также мне нужно было изменить public/images только на images, потому что папка public/images копируется в dist/images. Может быть, это проблема, и вам не нужен аддон.

Надеюсь, это решит вашу проблему.

person eguneys    schedule 20.07.2014
comment
Не могли бы вы связать меня с вашим репозиторием git? Похоже, вы не добавили его в свой package.json. - person bguiz; 21.07.2014
comment
@bguiz исправил это сейчас, я не добавлял его, потому что не уверен, что он работает правильно. - person eguneys; 21.07.2014
comment
@ facebook Извините, но у меня не было времени проверить это - кто-нибудь еще пробовал это и заставил это работать? - person bguiz; 27.07.2014
comment
@ facebook, который немного требователен, не так ли? Однако награда не присуждается мной, похоже, вам придется попросить пользователя, который ее предлагает, продлить ее. . Я бы сделал это, если бы мог, мне просто не очень повезло в данный момент после того, как я только что обновил свою ОС. См. это и это. - person bguiz; 27.07.2014
comment
@facebook это грубо. - person bguiz; 28.07.2014