Несколько стручков в одном рабочем пространстве

У меня есть большое рабочее пространство, в котором я хочу использовать базу, чтобы создать поверх нее другой проект, используя его код. Вместо того, чтобы работать непосредственно с кодом, я хотел бы создать еще один проект myProject с myPodProject, чтобы я мог получить доступ к их коду и модулям, а также независимо добавлять свой код и модули.

Оригинальная структура:

CoreApp
|
+-- CoreApp.xcworkspace
     |
     +-- CoreProject.xcodeproj
     +-- Pods.xcodeproj

Я создал собственное рабочее пространство с моим проектом, перетащил все основные проекты в рабочее пространство и указал на основные проекты с помощью "Путь поиска заголовка".

Итак, новая структура:

MyApp
|
+-- MyApp.xcworkspace
     |
     +-- MyProject.xcodeproj
     +-- CoreProject.xcodeproj
     +-- Pods.xcodeproj

Пока здесь все хорошо.

Теперь я хотел бы иметь свои собственные стручки. Но, похоже, проблема в том, что в одной рабочей области 2 Pods.xcodeproj.

Что я должен сделать, чтобы иметь это?

MyApp
|
+-- MyApp.xcworkspace
     |
     +-- CoreProject.xcodeproj
     +-- CorePods.xcodeproj
     +-- MyPods.xcodeproj
     +-- MyProject.xcodeproj

2 ответа

Решение

ОБНОВЛЕНИЕ: Возможно иметь два "Pods.xcodeproj" в одной рабочей области, но невозможно иметь их в одном каталоге.

Подкаталог решения

Если вы извлекаете "CoreProject" в подкаталог "MyProject", вы можете выполнить pod install в обоих каталогах "MyProject" и "CoreProject". Таким образом, оба проекта могут иметь свой собственный "Pods.xcodeproj".

Это структура файла после этого.

MyProject
├── MyProject
├── MyProject.xcodeproj
├── MyProject.xcworkspace
├── Podfile
├── Podfile.lock
├── Pods
│    └── Pods.xcodeproj
└── CoreProject
    ├── Core.m
    ├── CoreProject
    ├── CoreProject.xcodeproj
    ├── CoreProject.xcworkspace
    ├── Podfile
    ├── Podfile.lock
    └── Pods
         └── Pods.xcodeproj

Наконец, вы должны сделать следующие шаги.

  1. Откройте "MyProject.xcworkspace"
  2. Добавьте "CoreProject.xcodeproj" и его "Pods.xcodeproj"
  3. Ссылка "CoreProject" от "MyProject"

Не используйте "CoreProject.xcworkspace" для редактирования "MyProject".

Это структура проекта в данном случае.

MyProject.xcworkspace
|
+-- MyProject.xcodeproj
+-- Pods.xcodeproj (for MyProject)
+-- CoreProject.xcodeproj
+-- Pods.xcodeproj (for CoreProject)

Решение для совместного использования стручков

Если вы можете дотронуться до модулей CoreProject, подойдет следующее решение.

Вы должны создать новый "Pods.xcodeproj" и поделиться им с "MyProject" и "CoreProject".

Структура проекта выглядит следующим образом (так же, как ваша "новая структура", но модули заменяются на новые).

MyApp
|
+-- MyApp.xcworkspace
     |
     +-- MyProject.xcodeproj
     +-- CoreProject.xcodeproj
     +-- Pods.xcodeproj (your own)

Это образец Podfile для вашей рабочей области. Если вы связываете "CoreProject" из "MyProject", в этом случае вы можете использовать "AFNetworking" в обоих проектах, но можете использовать "SDWebImage" только в "MyProject".

Podfile

workspace 'MyApp'
xcodeproj 'CoreProject.xcodeproj'
xcodeproj 'MyProject.xcodeproj'

target "CoreProject" do
  pod 'AFNetworking'
  xcodeproj 'CoreProject.xcodeproj'
end

target "CoreProjectTests", :exclusive => true do
  pod 'OCMockito'
  xcodeproj 'CoreProject.xcodeproj'
end

target "MyProject" do
  pod 'SDWebImage'
  xcodeproj 'MyProject.xcodeproj'
end

target "MyProjectTests", :exclusive => true do
  pod 'OCHamcrest'
  xcodeproj 'MyProject.xcodeproj'
end

В дополнение к ответу xiongmaomaomao, если ваш второй проект (в данном случае, скажем, CoreProject) находится в другом каталоге (отдельно от MyProject и вашего Podfile), и вы хотите использовать модуль (например, OCMockito, для модульного тестирования) в обоих проекты, вам нужно сделать что-то вроде этого в вашем Podfile:

def mockito_shared_pod
  pod 'OCMockito', '~> 3.0'
end

target "MyProjectTests" do
  inherit! :search_paths
  mockito_shared_pod
end

target "CoreProjectTests" do
  mockito_shared_pod
  xcodeproj '../<path_to_proj_file>/CoreProject.xcodeproj'
end

Как видите, здесь важно определить 2 цели для каждого проекта, а для цели, связанной с проектом, который НЕ находится в каталоге MyProject / Podfile, необходимо указать, где находится этот проект, добавив xcodeproj значение.

mockito_shared_pod определение не является обязательным, но позволяет избежать необходимости указывать модуль дважды (по одному в каждой цели).

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

Другие вопросы по тегам