Управление зависимостями для библиотеки iOS - PullRequest
3 голосов
/ 01 января 2012

Прежде всего: почему управление зависимостями для проектов obj-c такая боль?!

Я пишу оболочку для моего RESTful-сервиса в target-c. Сервер представляет собой простое приложение sinatra, работающее локально в 'http://localhost:4567'.

Я включил RestKit, выполнив шаги, описанные здесь . Я знаю, что RestKit правильно «установлен» в моем проекте, потому что, когда я делаю #import <RestKit/RestKit.h>, проект собирается нормально.

Теперь я тестирую свою библиотеку, используя SenTesting.Framework. У меня есть класс в моей основной библиотеке, который выглядит следующим образом:

#import "CITWCore.h"
#import <RestKit/RestKit.h>
@implementation CITWCore

- (id)init
{
    self = [super init];
    if (self) {
      RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL:@"http://localhost:4567"];
        // Initialization code here.
    }

    return self;
}

@end

И мой класс модульных испытаний:

#import "CITWCoreTests.h"

@implementation CITWCoreTests


- (void)testItCreatesAnInstance
{
  CITWCore *newCoreObject = [[CITWCore alloc]init];
  STAssertNotNil(newCoreObject, @"new object should not be nil");
}

@end

Когда я запускаю тесты, используя ⌘U, тест завершается неудачно с этим сообщением:

error: testExample (CITWCoreTests) failed: -[__NSCFString isIPAddress]: unrecognized selector sent to instance 0xa115880

Ошибка вызывается по строке 292 в RKClient.m

if ([newBaseURLString isEqualToString:@"localhost"] || [hostName isIPAddress]) {

В проекте RestKit есть заголовочный файл с именем «NSString + RestKit.h», который содержит объявление метода -isIPAddress, и, насколько я могу судить, он включается, поэтому я понятия не имею, почему компилятор / запуск Время не знает об этом конкретном методе. Что-то не так с настройкой цели тестирования? Как я могу создать экземпляр RKObjectManager и пройти этот тест?

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

Ответы [ 3 ]

3 голосов
/ 01 января 2012

Дважды проверьте, чтобы в настройках сборки вашего проекта для «Другие флаги компоновщика» были указаны «-all_load» и «-ObjC» в вашей цели сборки.Пока вы там, убедитесь, что вы создали запись «Пути поиска заголовка» («$ (SOURCE_ROOT) / RestKit»).

Страница «Installing-RestKit-in-Xcode-4.x», котораяВы связались с, немного устарел с а) Xcode и б) RestKit HEAD (процесс сборки был недавно упрощен. FMI см. список рассылки.

Если вы хотите, чтобы проект был правильно настроен (я простосоздал его недавно, с новейшими Xcode и Restkit) взгляните на https://github.com/lottadot/lottadot-restkit-ios-rails3-1-advanced

Я думаю, если вы клонируете этот проект, отредактируете его конфигурацию и удалите «-all_load», вы увидите точное значение та же ошибка при запуске.

1 голос
/ 01 января 2012

В этом случае вам нужно найти файл (или изображение / библиотеку), который определяет / export -[NSString isIPAddress].Затем вам нужно будет добавить этот файл на этапе компиляции (если это исходный файл) или связать библиотеку с окончательным двоичным файлом (если это библиотека или объектный файл).В дополнение к привязке его к вашему приложению вам также необходимо скомпилировать или связать его с исполняемым файлом модульного теста .

Я знаю, что RestKit правильно «установлен» в моемпроект, потому что когда я делаю #import, проект строится просто отлично.

#import ing не обязательно связывает или компилирует все необходимые зависимости.Возможно, вам придется сделать это вручную.Xc4 может автоматически определять зависимость, а также создавать и связывать ее для вас, если опция включена - но она не всегда дает правильные значения (это хорошо для основных зависимостей).

Почему управление зависимостями для проектов obj-c такая боль?!

Это действительно не так, ИМО.Указание файлов для компиляции и библиотек для связи - это то, к чему вам нужно привыкнуть при компиляции языков семейства C.Если вы не хотите быть более конкретным в отношении этой критики ...

Как люди управляют такими зависимостями, как это?

Добавьте зависимые проекты в свои проекты Xcode.Сконфигурируйте их как зависимости для сборки - это обеспечит их сборку до того, как будет создано ваше приложение, и что сборки будут обновленыДля статических библиотек (нацеленных на iOS) сохраните этап связи для конечных исполняемых файлов.В более сложных сценариях вы захотите использовать файлы xcconfig, чтобы легко определить параметры сборки для любых / всех зависимостей.

0 голосов
/ 10 сентября 2012

Одним из простых решений является использование cocoapods , который является хорошим инструментом управления зависимостями, подобным maven в мире Java.

CocoaPods - довольно мощный и зрелый инструмент управления зависимостями, который может управлять библиотекамибиблиотеки, от которых они зависят (транзитивные зависимости), а также флаги компилятора и заголовка.

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

...