Диспетчер пакетов Swift и XCode: сохранение настроек XCode?
Я разрабатываю сервер в Swift и использую менеджер пакетов Swift. И мне удобно, когда я занимаюсь разработкой в моей системе Mac OS, чтобы сгенерировать проект XCode, чтобы использовать XCode в качестве моей IDE (то есть время от времени мои зависимости пакета должны обновляться. Я использовал swift package generate-xcodeproj
сделать это. Моя проблема приходит в этот момент - я создал некоторые настройки в XCode. Например, я установил флаг DEBUG, и у меня есть файл.plist, который находится на этапе копирования файлов. Они теряются, когда я воссоздаю проект Xcode. Кажется, я не могу просто использовать swift package update
потому что иногда файлы изменяются в зависимостях, и они не распространяются в проект Xcode.
То, что я хотел бы, это средство для отдельной установки настроек XCode в файле вне XCode, который может быть импортирован в XCode, когда я делаю swift package generate-xcodeproj
, Я не видел способ сделать это.
Связанный вопрос: когда я делаю swift build
Я бы хотел, чтобы использовались те же настройки сборки.
Предложения?
3 ответа
Я не могу помочь с Copy Files Phase
,
Однако я только что играл с условной компиляцией, вот так:
swift package generate-xcodeproj --xcconfig-overrides Sandbox.xcconfig
Sandbox.xcconfig
FLAG_SANDBOX = -DSANDBOX
OTHER_SWIFT_FLAGS = $(FLAG_SANDBOX)
Это создает проект Xcode, где SANDBOX
определяется
Это может быть использовано в быстром коде, как это
#if SANDBOX
print("sandbox")
#else
print("production")
#endif
Я бы использовал скрипт или make-файл для импорта ваших настроек в сгенерированный проект XCode, каждый раз, когда вы обновляете его. Вы можете использовать xcodeproj rubygem.
Смотрите пример скрипта.
Что касается использования ваших настроек в swift build
Можете привести пример такой настройки? В общем, make-файл может прочитать ваш файл настроек и передать соответствующие параметры swift build
,
Основываясь на ответе @ vadim выше, вот решение xcodeproj rubygem для первой части моего вопроса:
#!/usr/bin/ruby
# Tweak the .xcodeproj after creating with the swift package manager.
# Resources:
# https://stackru.com/questions/41527782/swift-package-manager-and-xcode-retaining-xcode-settings/41612477#41612477
# https://stackru.com/questions/20072937/add-run-script-build-phase-to-xcode-project-from-podspec
# https://github.com/IBM-Swift/Kitura-Build/blob/master/build/fix_xcode_project.rb
# http://www.rubydoc.info/github/CocoaPods/Xcodeproj/Xcodeproj%2FProject%2FObject%2FAbstractTarget%3Anew_shell_script_build_phase
# http://www.rubydoc.info/github/CocoaPods/Xcodeproj/Xcodeproj/Project/Object/AbstractTarget
# https://gist.github.com/niklasberglund/129065e2612d00c811d0
# https://github.com/CocoaPods/Xcodeproj
# https://stackru.com/questions/34367048/how-do-you-automate-do-copy-files-in-build-phases-using-a-cocoapods-post-insta?rq=1
require 'xcodeproj'
path_to_project = "Server.xcodeproj"
project = Xcodeproj::Project.open(path_to_project)
# 1) Add Copy Files Phase for Server.plist to the Products directory for Server target
target = project.targets.select { |target| target.name == 'Server' }.first
puts "Add Copy Files Phase to #{target}"
phase = target.new_copy_files_build_phase()
# Contrary to the docs (see http://www.rubydoc.info/github/CocoaPods/Xcodeproj/Xcodeproj/Project/Object/PBXCopyFilesBuildPhase) I believe this is not a path, but rather a code, e.g., 16 indicates to copy the file to the Products Directory.
phase.dst_subfolder_spec = "16"
fileRef = project.new(Xcodeproj::Project::Object::PBXFileReference)
fileRef.path = 'Server.plist'
phase.add_file_reference(fileRef)
# 2) Add in script phase for testing target-- because I haven't figured out to get access to the Products directory at test-run time.
target = project.targets.select { |target| target.name == 'ServerTests' }.first
puts "Add Script Phase to #{target}"
phase = target.new_shell_script_build_phase()
phase.shell_script = "cp Server.plist /tmp"
# 3) Add in DEBUG flag
# A little overkill, but hopefully appending a DEBUG flag in the Debug configuration for each target doesn't hurt it.
project.targets.each do |target|
puts "Appending DEBUG flag to #{target}"
if target.build_settings('Debug')['OTHER_SWIFT_FLAGS'].nil?
target.build_settings('Debug')['OTHER_SWIFT_FLAGS'] = ""
end
target.build_settings('Debug')['OTHER_SWIFT_FLAGS'] << '-DDEBUG'
end
project.save()