Подтвердить что ты не робот

Добавить файлы в проект Xcode с script?

Сейчас я использую несколько скриптов для генерации файлов, которые я включаю в качестве ресурсов в Xcode. Дело в том, что я запускаю script, а затем удаляюсь из проекта, а затем добавляю обратно в проект. Должен быть способ автоматизировать этот последний шаг, так что script может генерировать файлы и автоматически добавлять их в проект xcode для меня.

Я использую bash, но любые примеры языков помогут.

Спасибо, Эндрю

4b9b3361

Ответ 1

Это можно сделать, добавив новую фазу сборки в ваше приложение.

  • В вашем браузере проекта Xcode найдите цель для своего приложения и разверните ее, чтобы показать все фазы сборки.

  • Добавить новую "запустить script" фазу построения в вашу цель. Самый простой способ - щелкнуть правой кнопкой мыши по цели и выбрать "Добавить/Новая фаза сборки/Новый запуск Script Фаза сборки"

  • Добавление новой фазы сборки должно вызвать окно инспектора. В этом окне вы можете ввести всю оболочку script или просто командную строку для запуска script.

  • Здесь золото: внизу окна инспектора вы можете указать входные файлы и выходные файлы. Задание входных файлов автоматически устанавливает зависимости (оболочка Script будет выполняться только в том случае, если некоторые из входных файлов были изменены). Задание выходных файлов автоматически распространяется на эти файлы. Когда запускается ваша оболочка Script, Xcode знает, что ей нужно иметь дело с теми файлами, которые изменила оболочка Script.

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

  • Сохраните, создайте, передайте репозиторий, попросите рейз, получите свежий воздух и приятный день!:)

Ответ 2

У меня была такая же потребность, как у Эндрю. Мне нужно было включить ресурсы из script, не зная этих ресурсов раньше времени. Вот решения, которые я придумал:

Добавьте новую фазу сборки script после "Copy Bundle Resource", которая содержит следующую команду:

find -L ${SRCROOT}/SomeDerivedResources \
    -type f -not -name ".*" \
    -not -name "`basename ${INFOPLIST_FILE}`" \
    | xargs -t -I {} \
    cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/

Выглядит страшно, но позволяет разбить его:

find -L ${SRCROOT}/SomeDerivedResources

Это сканирует каталог SomeDerivedResources в нашем корневом каталоге (-L говорит ему следовать символическим ссылкам)

-type f

Включать только обычные файлы

-not -name ".*"

Игнорировать файлы, начинающиеся с точки

-not -name "`basename ${INFOPLIST_FILE}`"

В моем случае, мои Info plists живут в моем каталоге SomeDerivedResources, поэтому нам нужно исключить этот файл из копий в наш продукт

| xargs -t -I {}

Произведите результаты find в xargs с помощью -t (эхо-результирующие команды на stderr, чтобы они отображались в нашем журнале сборки), -I (запустите команду один раз для каждого входного файла) и используйте {} как наш аргумент placeholder

cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/

Наконец, скопируйте каждый найденный файл (обозначенный {}) в каталог ресурсов наших продуктов.

Я понял, когда набрал это, что использование установки rsync вместо cp может помешать нам копировать ресурсы при каждом создании. Если ваши ресурсы очень велики, возможно, стоит обратить внимание.

(Кроме того, ссылка на папку не будет работать для моей потребности по нескольким причинам. Одна, мои значки находятся в моей директории DerivedResources, и наличие их в подкаталоге в комплекте, похоже, не сработает. Кроме того, я идеально хотел быть в состоянии использовать [UIImage imageNamed:@"MyAwesomeHappyImage.png"] и -pathForResource:ofType: (и некоторые из моих файлов вложены дальше в мой каталог DerivedResources). Если ваши потребности не содержат этих ограничений, я настоятельно рекомендую вам перейти к эталонному маршруту.)

Ответ 3

Для тех, у кого большое количество файлов, чтобы избежать необходимости повторять (или перепроверять) каждый файл, как было предложено @Ben Cochran (большое спасибо за большой script), вот как это сделать с помощью rsync:

enter image description here

Ответ 4

Если у вас уже есть файлы где-то в вашей системе, относительно исходного корня, вы всегда можете добавить фазу "Копировать файлы" . Это позволит вам указать каталог, из которого должны быть скопированы ваши ресурсы.

Вы можете комбинировать это с фазовым ответом Build Script, предоставленным вам уже. Например, запустите Script, чтобы проверить свои активы из Subversion в подкаталог вашего проекта, а затем следуйте за ним на этапе копирования файлов, который копирует из "$ (SRCROOT)/Assets".

Ответ 5

В принципе, файлы просто нужно скопировать в основной пакет

В этом случае просто добавьте ссылку на папку в проект (создайте папку в папке проекта, а затем перетащите ее в свою группу "Ресурсы" (в списке "Файлы и группы", затем в появившемся листе выберите переключатель "Создать папку для любых добавленных папок" ), и Xcode скопирует папку и все ее содержимое в целевой комплект во время сборки.

Еще одно примечание. Если вы используете этот метод для добавления вложенных вложений изображений, вам нужно будет префикс имени изображения с именем подпапки, чтобы использовать '[UIImage imageNamed:]'. Например, если у вас есть изображение с именем "Rendezvous.png" в подпапке под названием "MyImages":

`

// this won't work
UIImage * image = [UIImage imageNamed:@"Rendezvous"];
if (image) {
    NSLog(@"Found Rendezvous!");
} else {
    NSLog(@"Didn't find Rendezvous.");
}

// but this will!
image = [UIImage imageNamed:@"MyImages/Rendezvous"];
if (image) {
    NSLog(@"Found MyImages/Rendezvous!");
} else {
    NSLog(@"Didn't find MyImages/Rendezvous.");
}

`

Ответ 6

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