Xcode 8 каждый раз перекомпилирует полный код


131

При любом изменении кода (хотя файл не в формате .pch) полный проект каждый раз перекомпилируется.


31
Почему это отклонено ?! Это законная проблема. Каждый раз на компиляцию уходит 4 минуты, что снижает производительность всей команды.
Джош

1
Я тоже понимаю эту проблему.
AJ9,

3
Вы модифицируете xib / раскадровки с помощью некоторых вещей, которые можно использовать в IBDesignable?
Ларм

1
Связанная ветка форума Apple: Forums.developer.apple.com/thread/62737 . По-прежнему нет обходного пути.
ldiqual

1
Обязательно откройте отчет об ошибке, как это предлагается на форуме Apple.
Лео Натан,

Ответы:


34

Обновление 2017/1/2

Эта проблема не решена в Xcode 8.2.1 (для моего проекта)

Как выжить?

Code IDE: Xcode/Atom
Build: xcrun
Debug: Xcode (Control + Command + R)

Обновление 2016/12/17

Эта проблема не была решена в Xcode 8.2.

Обновление 2016/12/12

Теперь мой выбор - это атом для кода и командная строка для сборки и отладки. Надеюсь, Apple скоро исправит эту ошибку.

Обновление 2016/12/04

Эта проблема, похоже, решена в Xcode 8.2 (бета 2) .

Но для меня это не решено, я сталкиваюсь с этой проблемой, даже когда использую Xcode 8.2. Вы можете попробовать (скачать Xcode8.2 beta2 здесь )

Система сборки • Xcode не будет перестраивать всю цель, если произошли только небольшие изменения. (28892475)


Старый ответ: это работа:

введите описание изображения здесь Вкладка «Настройка сборки» -> «Диалект языка C» -> Измените его на «По умолчанию для компилятора».

Для справки :

«Диалект языка C» был установлен на «GNU99» вместо «Compiler Default». Раньше стандартом был GNU99, но теперь его нет. В какой-то момент Xcode не смог правильно перенести настройки проекта библиотеки, поэтому было установлено значение GNU99. Как только я изменил его на GNU99, он перестал каждый раз перекомпилировать весь мой код!


1
Все идет нормально!!! Дайте мне один час, и награда будет вашей, если она сохранится.
Адам Уэйт

7
Ага, он вернулся к перекомпиляции всего
Адам Уэйт

1
У меня такое же поведение. Если я очищу производные данные (или изменю диалект языка C), это будет работать примерно для 10 сборок. После этого он возвращается, чтобы все перестроить.
bluebamboo

1
Xcode 8.2 (бета 2) работает для 10 сборок, затем восстанавливает все с нуля, но все же лучше, чем предыдущий.
Маркус

3
К сожалению, проблема сохраняется в Xcode 8.3 beta 2 (по крайней мере, для нас). В нашем проекте нет заметных улучшений.
Kasper Munck

20

Перейдите в Продукт -> Схема -> Изменить схему. Выберите "Сборка" в левом столбце и снимите флажок " Найти неявные зависимости ".

Но этот флаг должен оставаться установленным, когда вы строите проект впервые.


@Josh, вы используете несколько проектов в своем проекте (например, подпроект или включенный). И уверены ли вы, глядя на результаты своей сборки, что она действительно все перестраивает?
Mobile Ben

3
Это базовое рабочее пространство с коконодами и основным проектом. CocoaPods остается собранной, но основной проект перестраивает каждый файл; наблюдая за выходом сборки и определенно перестроением всех 100+ файлов.
Джош

1
Обновление: кажется, что это решение работает для нескольких сборок после этого, но также с очисткой всего проекта и перестройкой. Однако к 2-8 разу пересборки он начинает заново все перекомпилировать. Любые идеи? Помимо разочарования.
Джош

Это не работает, по крайней мере, не с рабочей областью CocoaPods. Все строится каждый раз. Очень раздражает, особенно с тех пор, как у Apple были годы, чтобы исправить эту проблему.
Womble

7

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


1
Ха, это может быть так просто :)
manmal

5

ОБНОВЛЕНО

Единственное самое большое улучшение, которое мне удалось сделать, - это модульное построение моего проекта. В частности, модулирование уровня ORM, который используется почти во всех других классах. Переместив этот код в отдельную цель в моем проекте и импортировав его как модуль, я смог значительно сократить время компиляции. Xcode больше не решает перекомпилировать ненужные файлы, когда я делаю сборку.

Теперь я использую метод компиляции одного файла для быстрой инкрементальной отладочной сборки.

В этой ссылке есть еще несколько хороших предложений, включая рефакторинг кода, https://medium.com/rocket-fuel/optimizing-build-times-in-swift-4-dc493b1cc5f5

OLD

Для меня все еще была постоянная проблема с Xcode 9. Как и многие из вас, я работаю над большим проектом Swift 4 / cocoapods со множеством исходных файлов, и каждый раз заново компилировать каждый файл, это бесит.

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

  • Схема -> Сборка -> «Найти неявные зависимости» = ИСТИНА
  • Настройки сборки -> Оптимизация времени компоновки = Инкрементальная
  • Настройки сборки -> Уровень оптимизации (отладка) = Нет [-OO]
  • Настройки сборки -> Уровень оптимизации (выпуск) = Самый быстрый, самый маленький [-Os]
  • Настройки сборки -> Увеличить совместное использование предварительно скомпилированных заголовков = ДА
  • Настройки сборки -> Включить инкрементную дистилляцию = ДА

Добавлены пользовательские настройки сборки, определяемые пользователем,

  • Настройки сборки -> HEADERMAP_USERS_VFS = YES

Примечание. У меня нет настраиваемой пользовательской настройки для оптимизации всего модуля.


3

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

  1. Удалите из заголовка префикса все импортированные файлы из каталога собранных продуктов, чтобы вы могли изменить параметр сборки для этого («Предварительно скомпилированный заголовок использует файлы из каталога сборки») на «Нет». Убедитесь, что он не импортируется косвенно через другой импорт.
  2. Удалите любой импорт из заголовка префикса, который использует модули Clang (библиотеки или фреймворки, у которых есть файл module.modulemap в их каталоге заголовков, чтобы вы могли писать такой код @import MyModule). (Для меня это и шаг 1 были одним и тем же.)
  3. Установите для параметра сборки для совместного использования заголовка префикса значение «Да». (Я не думаю, что это необходимо, и это не должно иметь никакого эффекта в моем собственном проекте. Я просто заявляю об этом, потому что я изменил его, потому что я был готов попробовать что угодно. :))
  4. Выйдите из Xcode и удалите каталог DerivedData / ModuleCache (настроенный как ~ / Library / Developer, если я правильно помню).

Если это по-прежнему не работает, вы можете попробовать удалить еще несколько импортированных файлов из заголовка префикса. Может быть что-то его сбивает ...


3

Похоже, они активно работают над этим в соответствии с https://forums.developer.apple.com/thread/62737, но обходной путь - добавить

HEADERMAP_USES_VFS = YES

в настройках сборки вашей цели (Project -> Target -> Build Settings -> User Defined).

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

РЕДАКТИРОВАТЬ: все еще иногда перекомпилируйте все, хотя, похоже, это делается гораздо реже с этим определенным параметром.


Я также добавил это значение, время сборки быстрее, но это не решило инкрементную сборку. Я изменил компилятор Swift - генерация кода / отладка на быструю оптимизацию всего модуля ... это лучший результат на данный момент,
Антонио Младший,

я даже не могу найти User Defined)
David Seek

2
@DavidSeek находится в самом низу настроек сборки
Laser Hawk

1
если вы его не видите, прочтите этот meandmark.com/blog/2011/03/xcode-4-accessing-build-settings
Laser Hawk

3

Проверяйте весь свой код в @IBDesignableдирективах в моем конкретном случае проекта сборки Xcode все время, потому что у меня было несколько представлений на моей раскадровке, которые содержали в себе эти @IBDesignableатрибуты. Во-вторых, моя раскадровка открыта в отдельном окне (а не на вкладке), что навсегда заставляет мои сборки Xcode делать сборки для всех симуляторов.


Мы используем довольно много @IBDesignableдиректив ... есть ли что-то особенное, что мы должны искать?
Stan

Я думаю, что их можно найти, исключая по одному, и проверить результат, в моем случае это были только 2 директивы @IBDesignable во всем проекте.
ua24

2

Мадхури Мане в этом совершенно прав. Чтобы добавить немного большей ясности, обратите внимание на некоторые важные моменты:

Это применимо ТОЛЬКО, если у вас есть неявная зависимость от библиотек / фреймворков, на которые опирается ваша цель.

Если "Найти неявные зависимости" отключен:

Результат: библиотека не будет создана до создания целевого приложения. Целевое приложение не может быть построено.

Исправление: чтобы гарантировать, что второй сценарий не произойдет, вы должны добавить необходимые цели в список целей и правильно расположить их.

Источник и дополнительная литература по теме: https://pewpewthespells.com/blog/managing_xcode.html#scheme-action

Теперь, если весь ваш проект размещен в одной цели и компиляция занимает 4 минуты, вы ничего не можете с этим поделать, кроме как разбить его на фреймворки, чтобы воспользоваться вышеуказанным или выяснить, где происходит задержка компиляции. Если вы используете что-то вроде PaintCode или у вас есть большие фрагменты кода UIKit, быстро измените его на Objective-c, он компилируется намного быстрее


2

Перейти к настройкам сборки вашей цели и набору Defines Moduleв Yes.

Сработал для меня пару сборок, слишком рано, чтобы утверждать, что это окончательный обходной путь, но, по крайней мере, мы пытаемся.


2

Apple выпустила новую бета-версию Xcode вчера (14 ноября)

Xcode 8.2 beta 2

В примечании к выпуску эта проблема отмечена как решенная.

Система сборки

• Xcode не будет перестраивать всю цель, если произошли только небольшие изменения. (28892475)

Это работает для меня. Скорость сборки вернулась как обычно. Всем, кто сталкивается с этой проблемой, стоит попробовать!

https://developer.apple.com/download/


2

Пожалуйста, перейдите к настройкам сборки проекта и измените «Диалект языка Си».

"Диалект языка C" установлен на "GNU99" вместо "Compiler Default" при обновлении версии xcode. В какой-то момент Xcode не смог правильно перенести настройки проекта библиотеки, поэтому было установлено значение GNU99. Это решит проблему


1

Если вы внесли изменения в файл Swift, начните сборку приложения, перейдите на последнюю вкладку и щелкните журнал сборки, на этапе «Проверка зависимостей» остановите сборку и запустите ее снова. При втором запуске он должен собрать только те файлы, которые вы изменили. Если все сделано правильно, я обнаружил, что он работает каждый раз. Нет необходимости вносить какие-либо изменения в настройки проекта.

Похоже, это ошибка в Xcode.

введите описание изображения здесь

Если вы видите, что приложение выполняет полную сборку, остановите сборку и попробуйте этот трюк еще раз.

Если вы не внесли изменений в код, используйте CMD + CTRL + R для запуска без создания приложения, которое подключает отладчик. Не будет создавать приложение, но поможет сэкономить ненужное время.


Это действительно работает, но иногда XCode не работает с кодом 1, и вам придется сделать чистую сборку. Это кошмар
Антонио Джуниор

Есть и другие сценарии, в которых Xcode всегда будет выполнять полную сборку. Я обнаружил, что если вы измените файл .h, включенный в заголовок моста, он восстановит все файлы Swift. Могут быть и другие сценарии, не связанные с ошибкой Xcode.
Влад

Существуют сценарии, в которых единственным изменением является переименование функции или добавление нового свойства к существующему классу / структуре, что приводит к полной перестройке.
Антонио Джуниор

Обратитесь к этому вопросу / ответу, этот поток является дубликатом этого: Есть решение, которое работает лучше: stackoverflow.com/questions/39456223/…
Влад

1

Проблема с моей стороны исправлена ​​снятием флажка с решения «Найти неявные зависимости».

НО помните, если вы используете cocoapods, чтобы применить эти настройки также к вашему проекту pod, выбрав его из

Продукт -> Схема -> Пакеты- "yourProjectName"

также применяются в:

Продукт -> Схема -> "yourProjectName"

Это поможет мне, так что я надеюсь, что этот совет поможет кому-то другому.

Спасибо


1

Попробуйте: 1. Перейдите к проекту 2. Щелкните "Параметры сборки". 3. Убедитесь, что для параметра OptimizationLevel установлено значение "Нет" для отладки. 4. Щелкните Добавить пользовательскую настройку. 5. Установите для SWIFT_WHOLE_MODULE_OPTIMIZATION значение ДА.

введите описание изображения здесь


нечего работать, он все равно компилируется, когда я пишу одно письмо.
Чандни

-2

Чтобы увеличить время компиляции xcode, можно использовать IRAMDISK (виртуальный диск памяти). Очень полезное и эффективное средство для сокращения времени компиляции.

Также можно использовать для ускорения часто используемых приложений.

обратитесь по следующей ссылке для загрузки и использования: http://iramdisk.findmysoft.com/mac/


Это не ускорит компиляцию, если у вас уже есть SSD-диск.
Jano
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.