В ESE у меня была хорошая беседа с Крисом (на самом деле, у меня было много хороших чатов с большим количеством хороших людей — было довольно сложно посетить любую из сессий), который сказал мне, что он изучает движки шаблонов. , Я оставляю на ваше усмотрение делать какие-либо предположения о том, почему он заинтересован в шаблонизаторах Мне довелось знать, по крайней мере, три движка шаблонов: Velocity (который я имел удовольствие использовать в мои активные дни на AndroMDA.org), механизм шаблона, erhm, …, используемый в PDE ( однажды я исправил ошибку, которая приводила к был вызван этим движком) и — как вы уже догадались — Xpand (на котором я являюсь коммиттером).
Итак, я дал небольшую демонстрацию Xtext и Xpand, чтобы показать Крису, как легко создавать (основанные на модели) шаблоны генерации кода. Xpand поставляется с красивым редактором, который делает редактирование шаблонов приятным — он имеет подсветку кода, навигацию по гиперссылкам, осведомленность о модели и другие достоинства редактора.
Вместо того, чтобы рассказывать, как это работает, только Крису, вот краткое руководство о том, как написать собственный шаблон Xpand и использовать его в мастере. Чтобы сделать пример более реалистичным, я решил реализовать мастер, который создает файл Ant build.xml для простого проекта (чего нет в Eclipse, AFAIK). Итак, поехали.
Предпосылки:
- Затмение 3.5M3 (3.4 также может сделать)
- ЭДС 2.5.0М3
- ЭДС Сравнить 0.8.1
- MWE 0.7.0M3
- Xpand 0.7.0M3
Как это сделать
- Загрузите и установите необходимые компоненты.
- Создайте новый проект плагина с именем «de.peterfriese.antwizard»
- Добавить Мастер создания файлов в проект. Я использовал Мастер пользовательских плагинов, чтобы начать работу.
- Очистите страницу мастера и добавьте несколько полей для имени проекта, исходной папки и двоичной папки.
- Мы хотим перенести значения, введенные в этом мастере, в наш шаблон, поэтому нам нужно создать модель Ecore, которая описывает нашу модель данных.
- Добавьте org.eclipse.emf и org.eclipse.emf.edit к зависимостям вашего плагина.
- Создайте genmodel и позвольте EMF сгенерировать код модели для вас.
- Добавьте код в мастер, который передает значения из полей ввода в вашу модель. Можно подумать об использовании привязки данных для этого, я пока что использовал прямой подход read’n’write:
public boolean performFinish() { final String containerName = page.getContainerName(); final String srcDirName = page.getSrcDirName(); final String binDirName = page.getBinDirName(); // ... } private BuildSpecification createModel(IProject project, String srcDirName, String binDirName) { BuildSpecification buildSpecification = BuildspecificationFactory.eINSTANCE.createBuildSpecification(); Project projectSpecification = BuildspecificationFactory.eINSTANCE.createProject(); projectSpecification.setName(project.getName()); projectSpecification.setBinaryFolder(binDirName); projectSpecification.setSourceFolder(srcDirName); buildSpecification.setProject(projectSpecification); return buildSpecification; }
- Создайте шаблон Xpand de.peterfriese.antwizard / src / template / BuildTemplate.xpt :
Если вам интересно, как получить эти забавные символы: убедитесь, что мы создали этот файл с помощью редактора Xpand — в нем есть помощь по коду (CTRL + пробел) для этих символов.
- Создайте файл Xtend de.peterfriese.antwizard / src / template / GeneratorExtensions.ext :
- Добавьте org.eclipse.xpand , org.eclipse.xtend и org.eclipse.xtend.typesystem.emf к зависимостям вашего плагина.
- Наконец, нам нужно предоставить некоторый код для вызова генератора:
private void generate(BuildSpecification buildSpec, IProgressMonitor monitor) throws CoreException { // get project root folder as absolute file system path IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IResource resource = root.findMember(new Path(buildSpec.getProject().getName())); String containerName = resource.getLocation().toPortableString(); // configure outlets OutputImpl output = new OutputImpl(); Outlet outlet = new Outlet(containerName); outlet.setOverwrite(true); output.addOutlet(outlet); // create execution context Map globalVarsMap = new HashMap(); XpandExecutionContextImpl execCtx = new XpandExecutionContextImpl(output, null, globalVarsMap, null, null); EmfRegistryMetaModel metamodel = new EmfRegistryMetaModel() { @Override protected EPackage[] allPackages() { return new EPackage[] { BuildspecificationPackage.eINSTANCE, EcorePackage.eINSTANCE }; } }; execCtx.registerMetaModel(metamodel); // generate XpandFacade facade = XpandFacade.create(execCtx); String templatePath = "template::BuildTemplate::main"; facade.evaluate(templatePath, buildSpec); // refresh the project to get external updates: resource.refreshLocal(IResource.DEPTH_INFINITE, monitor); }
Это оно!
Принимая это за спин
- Запустите рабочую среду времени выполнения, выбрав de.peterfriese.antwizard / META-INF / MANIFEST.MF и вызвав Run As -> Eclipse Application.
- Создайте новый проект Java в рабочей области времени выполнения.
- Вызовите ваш мастер, выбрав Файл -> Создать -> Другие … -> Ant -> Файл сборки Ant из существующего проекта.
- Введите необходимую информацию (название проекта, исходная папка, папка binariy)
- После нажатия на финиш , вы должны получить новый Ant-файл для вашего проекта:
- Наслаждайтесь!
Вы можете скачать проект здесь . Отзывы и комментарии приветствуются!