Использование .swc в проекте библиотеки Flex

#flash #apache-flex #adobe #builder #swc

#flash #apache-flex #adobe #Конструктор #swc

Вопрос:

Я пытаюсь настроить производственную среду примерно для 10 связанных ресурсов. Определенные элементы, визуальные и иные, будут разделены между 10 ресурсами. Я рассматриваю каждый из них как отдельный чистый проект AS3 во Flash Builder 4.

С каждым ресурсом связан .fla, который выводит .swc в папку libs для этого ресурса — окончательная компиляция будет выполнена через ant, а исходным кодом верхнего уровня является файл main .as в каждом проекте Flash Builder.

Поскольку определенные элементы являются общими для нескольких ресурсов, я создал проект библиотеки Flex в своей рабочей области. В этом библиотечном проекте есть папка /src со стандартной структурой, а также папка / lib /, в которую я вставляю, например, TweenLite от greensock.

В дополнение к исходному коду и стороннему .swc, проект библиотеки также имеет FLA, который экспортирует .swc в папку /lib /.

Вот проблема: я не могу видеть экспорт библиотеки из этого .swc в моих связанных проектах. Теоретически, каждый класс, который я экспортирую из библиотеки проекта библиотеки Flex .fla, должен быть скомпилирован в .swc проекта библиотеки. Я нахожу, что это не так, и я не понимаю, почему.

Я собираюсь продолжить копать, но я хотел бы добавить это сюда на случай, если кто-нибудь еще столкнулся с этими проблемами. Кто-нибудь знает, что я делаю не так?

РЕДАКТИРОВАТЬ: Так что, по-видимому, мой greensock .swc также не компилируется в конечный результат. Вчера это было. Я не уверен, что изменилось. Я предполагаю, что мой вопрос, сформулированный следующим образом: как я могу убедиться, что файлы .swc, включенные в путь сборки для моего проекта библиотеки Flex, содержат все свои классы, включенные в окончательный .swc, который генерирует FLP?

РЕДАКТИРОВАНИЕ 2: Я обнаружил своего рода ужасный обходной путь. Прямо сейчас я создал единственный класс в своей папке src и объявляю все, что я хочу включить из любого из моих .swc-файлов, например, общедоступную переменную TweenLite:TweenLite, общедоступную переменную logo: Logo и т.д. Я обнаружил, что если я объявлю его в одном из своих исходных файлов, то смогу получить к нему доступ в соответствующем проекте. Одного его импорта недостаточно — это означает, что мне пришлось бы вручную объявлять каждый класс, к которому я хочу получить доступ. Должен быть лучший способ. Чего мне не хватает?

Комментарии:

1. Какой тип ссылки установлен для вашего swc на вкладке свойств проекта библиотеки Flex Library Build Path > Library Path ? Так ли это Merged into code ?

2. ДА. Я только что придумал обходной путь, собираюсь обновить свой пост — но это все еще ЛАВАШ. Но да, в настоящее время выбрано «Объединено в код». Был выбран другой вариант, «Использовать по умолчанию (внешний)», — он некорректно работал ни с тем, ни с другим.

3. Кстати, вы правы, директива import не включает импортированный класс в компиляцию. Но вы не должны включать (объявлять) все классы из swc. Если все классы там связаны, вы можете объявить только основной класс, который ссылается друг на друга цепочкой. И вы можете связывать классы, используя более простой синтаксис, чем объявление каждого отдельного класса: private static var linking:Array = [Class1, Class2];

Ответ №1:

Я столкнулся с некоторыми проблемами, которые находятся в той же строке, где мы получали класс A из SDK swc 1 и класс B из SDK swc 2 (результаты ошибки BlendMode), в конце концов, мы должны были гарантировать, что все наши зависимости были скомпилированы с определенной версией SDK (тоже не весело). Я думаю, это звучит так, как будто вам нужна библиотека, которая содержит исходники из всех других библиотек, от которых зависит ваша новая библиотека.

По сути, каждый swc представляет собой файл каталога и байт-код ActionScript (ABC) для файлов ActionScript (AS), сжатых в zip, поэтому вы хотели бы объединить обе эти части в единый swc.

Использование Runtime Shared Libraries (RSL) означает, что вместо извлечения байт-кода из swc и включения его в ваш swf-файл во время компиляции он загрузит swc (называемый swz, когда упакован таким образом) во время выполнения. Недостатком является то, что он сохраняет все классы в swz, а не только извлекает байт-код для того, что вам нужно, когда выполняется во время компиляции. Таким образом, переход к компоновке через RSL, я полагаю, должен привести к желаемому результату, но вам придется сгенерировать swz-файлы из вашей библиотеки. В конечном итоге вам все равно может потребоваться сделать что-то нелепое, например, добавить ссылки на все, что вы хотите, в свою swz (из других swc), но я считаю, что вы должны быть в состоянии решить проблему таким образом каким-то образом… Я продолжаю искать лучшее решение и отредактирую это, если найду:

http://tv.adobe.com/watch/adc-presents/creating-runtime-shared-libraries/

Редактировать 1:

Также нашел это:

compc -путь к источнику ../mycomponents/components/local -include-classes CustomCellRendererComponent -directory=true -debug=false -вывод ../библиотеки/CustomCellRenderer

С этой страницы:

http://livedocs.adobe.com/flex/3/html/help.html?content=rsl_01.html#168690

Пара мыслей по этому поводу тоже, поскольку я осматривался, 1 это будет ужасно неэффективно с точки зрения пространства, отсюда и вся работа по включению только используемых вами классов, 2 если использовать описанный выше метод, я бы, вероятно, написал Java-приложение, которое будет просматривать папки проектов для всех имен классов, чтобы я мог заставить его генерировать список всех классов в пространстве проекта.

Спасибо, что выслушали мои мысли (все еще WIP :),

Шон

Комментарии:

1. Спасибо, Шон, похоже, ты на правильном пути. Я вернусь к этому сегодня днем, так что посмотрим, что это мне даст!