{"id":21748322,"url":"https://github.com/surfstudio/targetscheck","last_synced_at":"2026-03-05T09:02:12.207Z","repository":{"id":71210960,"uuid":"213700661","full_name":"surfstudio/TargetsCheck","owner":"surfstudio","description":"Пример скрипта для XCode проекта, проверяющего его консистентность, и пример использования.","archived":false,"fork":false,"pushed_at":"2019-10-12T12:21:20.000Z","size":241,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-13T07:15:12.486Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/surfstudio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-10-08T16:53:28.000Z","updated_at":"2022-10-24T08:57:54.000Z","dependencies_parsed_at":"2023-03-16T20:00:17.832Z","dependency_job_id":null,"html_url":"https://github.com/surfstudio/TargetsCheck","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/surfstudio/TargetsCheck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surfstudio%2FTargetsCheck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surfstudio%2FTargetsCheck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surfstudio%2FTargetsCheck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surfstudio%2FTargetsCheck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/surfstudio","download_url":"https://codeload.github.com/surfstudio/TargetsCheck/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surfstudio%2FTargetsCheck/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30117480,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T08:19:04.902Z","status":"ssl_error","status_checked_at":"2026-03-05T08:17:37.148Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-26T08:13:03.948Z","updated_at":"2026-03-05T09:02:12.187Z","avatar_url":"https://github.com/surfstudio.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TargetsCheck\n\nКак часто вам приходилось сталкиваться с проблемой, когда на проекте два target'а, а какой-нибудь разработчик, добавляя новые файлы, линкует их только к одному, забывая про второй? И проект потом не собирается. Или проблема обнаруживается только на CI во время сборки, что отнимает время у сборочных нод и приводит к образованию больших очередей на них.\nЕсли эта боль вам знакома - то этот скрипт для вас)\n\n## Описание\n\nФактически, скрипт выполняет следующие шаги:\n\n* на вход получает путь до файла проекта, а также таргеты, файлы в которых необходимо сравнить\n* по пути до проекта находит сам проект\n* берет оттуда нужные таргеты, собирает файлы из них (Compile Sources, Copy Bundle Resources и Frameworks)\n* разница между списками файлов - это те файлы, которые есть в одном таргете, но нет в другом\n* среди них могут оказаться те, которые там и должны быть (к примеру, файлы с константами, которые различаются в зависимости от таргета (baseUrl), либо файлы GoogleInfo.plist, к примеру) - это наш whitelist\n* выкидывает из разницы файлы из whitelist\n\nЕсли получившийся список не пуст - то у нас проблемы. Значит, тот или иной файл/фреймворк были добавлены в один таргет и не добавлены в другой.\n\nТаки образом, скрипт позволяет убедиться, что все фалйы из Compile Sources, Copy Bundle Resources, а также сторонние фреймворки (особенно актуально, если в вашем проекте многомодульная структура) были корректно добавлены к обоим таргетам.\n\n## Как использовать\n\n1. Берем файл `/scripts/sourcesComparing.rb` и переносим его в папку scripts в корне вашего проекта. Рядом с ним нужно положить файл `sourceComparingWhitelist.txt`. В файле .rb - лежит непосредственно сам скрипт, в файле .txt - необходимо прописать те файлы, которые необходимо игнорировать в ходе проверки. При подключении к уже существующему рабочему проекту - рекомендуется запустить скрипт с пустым файлом whitelist, отхватить ошибок (в случае наличия файлов, явно пролинкованных к разным таргетам, или, к примеру, наличия cocoapods-зависимостей), после чего уже добавить эти файлы в whitelist.\n\n2. Добавить новую Build Phase (конечно, в оба таргета):\n\n\u003cp align=\"center\"\u003e\n\t\u003cimg src=\"./Pictures/buildPhase.png\" /\u003e\n\u003c/p\u003e\n\nНеобходимо вызывать непосредственно скрипт:\n\n`ruby ./scripts/sourcesComparing.rb  \"./TargetsCheck.xcodeproj\" \"TargetsCheck\" \"TargetsCheck Debug\"`\n\nпоставив в качестве первого параметра - путь до файла .xcodeproj вашего проекта, а далее - названия таргетов, которые необходимо сравнить между собой.\n\n**Дополнительно** в данном репозитории показан пример, когда вызов скрипта выполняется несколько другим способом:\n\n- добавляется новая команда `targets_check` в Makefile\n- вызов скрипта идет через bundler:\n\t- `bundle exec ruby ./scripts/sourcesComparing.rb  \"./TargetsCheck.xcodeproj\" \"TargetsCheck\" \"TargetsCheck Debug\"`\n- вызов `targets_check` добавлен в команду `make lint` для дополнительного прогона скрипта на CI\n- в Build Phase вызывается команда `make targets_check`\n\nВ этом случае возможны проблемы, если вы не используете системынй Ruby -\u003e XCode не дружит с выполнением скриптов через bundle в Build Phase.\n\nТаким образом, после выполнения всех действий мы получим проект, в котором на каждый build будет проходить проверка его консистентности.\n\n## Результаты\n\nЕсли вы, к примеру, забыли прикрепить файл DeepLinkOption.h и модуль TestModule ко второму таргету, то получите следующее сообщение об ошибке:\n\n\u003cp align=\"center\"\u003e\n\t\u003cimg src=\"./Pictures/fail.png\" /\u003e\n\u003c/p\u003e\n\nВ случае успеха - вас ждет единорожек:\n\n\u003cp align=\"center\"\u003e\n\t\u003cimg src=\"./Pictures/success.png\" /\u003e\n\u003c/p\u003e\n\n## Настройка окружения и запуск тестового проекта\n\nДля настройки окружения для тестового проекта достаточно в корне проекта выполнить команду `make init`.\n\nНа вашу машину установятся все необходимые зависимости нужных версий при помощи `bundler`, а также автоматически выполнится команда `pod install`.\n\nПосле этого можно открывать .xcworkspace файл проекта и начинать над ним работу. К примеру, удалить некоторые файлы из одного таргета, чтобы убедиться в работе скрипта)\n\n**Важно** - возможны проблемы с версией `bundler`, если текущая установленная версия конфликтует с необходимыми для работы проекта гемами. Рекомендуется использовать версию **1.17.1**","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsurfstudio%2Ftargetscheck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsurfstudio%2Ftargetscheck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsurfstudio%2Ftargetscheck/lists"}