Автоматизируем работу с проектами Xcode средствами Ruby

в 11:03, , рубрики: development, gem, iOS, osx, ruby, xcode, Программирование, метки: , , , , ,

Привет. Существует ряд задач, для реализации которых нет необходимости в использовании графического интерфейса Xcode. Время исполнения таких задач может сократиться как минимум на время запуска Xcode. Экономия времени может показаться незначительной при работе с одним проектом, но если проектов много, процесс их редактирования может оказаться очень утомительным. Но самое главное, что такой подход открывает возможности для автоматизации работы с проектами.

Я хочу рассказать о новом инструменте, целью которого является решение описанной проблемы. XcodeProject — это библиотека на языке Ruby которая может быть использована для чтения данных проекта Xcode и их изменения, а так же для сборки проектов, архивирования и выполнения ряда задач по автоматизации работы с ними.

image

Установка

Библиотека представляет собой gem, его установку можно выполнить из терминала следующей командой:

gem install xcodeproject

Начало работы

Простейший пример использования библиотеки, который отобразит все цели проекта:

require 'rubygems'
require 'xcodeproject'

proj = XcodeProject::Project.new('path/to/example.xcodeproj')
proj.read.targets.each do |target|
puts target.name
end

Для начала необходимо создать объект типа XcodeProject::Project:

proj = XcodeProject::Project.new('path/to/example.xcodeproj')

Или можно найти все проекты Xcode в заданной директории:

projs = XcodeProject::Project.find_projs('path/to/dir')

После того, как объект проекта создан, можно прочитать данные из него:


data = proj.read
p data.target('example').config('Release').build_settings

Или изменить данные:

proj.change do |data|
data.target('example').config('Release').build_settings['GCC_VERSION'] = 'com.apple.compilers.llvmgcc42'
end

Файлы, группы и директории

Отобразим все группы наивысшего уровня:

data.main_group.children.each do |child|
p child.name
end

Отобразим только файлы из заданной группы:

group = data.group('path/from/main_group')
group.files.each do |file|
p file.name
end

В любой момент вы можете получить GroupPath группы. GroupPath — это путь к группе относительно корня проекта (корнем проекта является Main Group, скрытая группа, которая является родителем всех групп проекта) или текущей группы.

group.group_path

Директории — это группы, которые представлены в вашей файловой системе. Для них можно получить FilePath — реальный путь в файловой системе к директории с которой ассоциирован объект.

group.total_path

Вы можете добавить группу к проекту, указав GroupPath к ней, отновительно корня проекта:

data.add_group('path/from/main_group')

Или относительно текущей группы:

group.add_group('path/from/current_group')

Для добавления директории к проекту необходимо указать FilePath к ней:

data.add_dir('group_path/to/parent', '/file_path/to/dir')
group.add_dir('/file_path/to/dir')

Добавить файл к проекту можно аналогичным образом:


data.add_file('group_path/to/parent', '/file_path/to/file')
group.add_file('/file_path/to/file')

Так же вы можете удалять файлы и группы из проекта:

data.remove_file('path/from/main_group')
data.remove_group('path/from/main_group')

group.remove_file('path/from/current_group')
group.remove_group('path/from/current_group')

Цели

Получить объект цели просто:

target = data.target('example')

После того как добавлен файл к проекту, можно использовать его для сборки цели:

file = main_group.add_file('/file_path/to/file')
target.add_source(file)

Исключить файл из сборки можно следующим образом:

target.remove_source(file)

Сборка прокта

XcodeProject использует XcodeBuilder для сборки проектов.

Компиляция проекта:


proj.build

Удаление объектных файлов, созданных в процессе сборки:

proj.clean

Архивирование проекта:

proj.builder.scheme = 'example'
proj.archive

Можно указать параметры сборки:

proj.builder.configuration = 'Debug'
proj.builder.arch = 'armv7'
proj.build

Получить больше информации по XcodeBuilder можно по сылке.

В завершение, пару слов по проекту XcodeProject. Проект находится в стадии разработки и обладает лишь небольшим функционалом представленном в Xcode. Появление новых возможностей будет связана с реальными портебностями в них, в ближайшее время можно ожидать функционал характерный для iOS разработки: сборку универсальных библиотек для симулятора и устройства и постоения псево фрейморков на их базе. Так же функционал сборки deb-пакетов для Cydia репозитория. Проект доступен под лицензией MIT, вы можете использовать код проекта как пожелаете. Любая помощь в развитии проекта приветствуется.

Адрес проекта на github.

Автор: aenesterov

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js