Модуль: OS::Mac::Xcode Закрытый
- Определён в:
- os/mac/xcode.rb
Обзор
Этот модуль является частью закрытого API. Этот модуль можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот модуль, поскольку он может быть удалён или изменён без предупреждения.
Вспомогательный модуль для получения сведений о Xcode.
Сводка констант свернуть
- DEFAULT_BUNDLE_PATH =
Эта константа является частью закрытого API. Эту константу можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать эту константу, поскольку она может быть удалена или изменена без предупреждения.
T.let(Pathname("/Applications/Xcode.app").freeze, ::Pathname)
- BUNDLE_ID =
Эта константа является частью закрытого API. Эту константу можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать эту константу, поскольку она может быть удалена или изменена без предупреждения.
"com.apple.dt.Xcode"- OLD_BUNDLE_ID =
Эта константа является частью закрытого API. Эту константу можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать эту константу, поскольку она может быть удалена или изменена без предупреждения.
"com.apple.Xcode"- APPLE_DEVELOPER_DOWNLOAD_URL =
Эта константа является частью закрытого API. Эту константу можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать эту константу, поскольку она может быть удалена или изменена без предупреждения.
"https://developer.apple.com/download/all/"
Сводка методов класса свернуть
- .below_minimum_version? ⇒ Boolean закрытый
- .bundle_path ⇒ ::Pathname? закрытый
- .default_prefix? ⇒ Boolean закрытый
- .detect_version ⇒ String? закрытый
- .detect_version_from_clang_version(version = ::DevelopmentTools.clang_version) ⇒ String закрытый
- .installation_instructions ⇒ String закрытый
- .installed? ⇒ Boolean закрытый
- .latest_sdk_version? ⇒ Boolean закрытый
- .latest_version(macos: MacOS.version) ⇒ String закрытый
Изменяйте эти значения, когда новая версия станет доступна в App Store и наши системы CI будут обновлены.
- .minimum_version ⇒ String закрытый
Изменяйте эти значения, если без этого всё будет серьёзно нарушено (например, для этой версии macOS не будет SDK).
- .needs_clt_installed? ⇒ Boolean закрытый
- .outdated? ⇒ Boolean закрытый
- .prefix ⇒ ::Pathname? закрытый
Возвращает объект Pathname, соответствующий каталогу Developer в Xcode.app, или nil, если Xcode.app не установлен.
- .sdk(version = nil) ⇒ SDK? закрытый
- .sdk_locator ⇒ XcodeSDKLocator закрытый
- .sdk_path(version = nil) ⇒ ::Pathname? закрытый
- .toolchain_path ⇒ ::Pathname закрытый
- .update_instructions ⇒ String закрытый
- .version ⇒ ::Version внутренний
Получает версию Xcode.
- .without_clt? ⇒ Boolean закрытый
Подробное описание методов класса
.below_minimum_version? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
54 55 56 57 58 | # File 'os/mac/xcode.rb', line 54 def self.below_minimum_version? return false unless installed? version < minimum_version end |
.bundle_path ⇒ ::Pathname?
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
107 108 109 110 111 112 113 114 115 | # File 'os/mac/xcode.rb', line 107 def self.bundle_path # Use the default location if it exists. return DEFAULT_BUNDLE_PATH if DEFAULT_BUNDLE_PATH.exist? # Ask Spotlight where Xcode is. If the user didn't install the # helper tools and installed Xcode in a non-conventional place, this # is our only option. See: https://superuser.com/questions/390757 MacOS.app_with_bundle_id(BUNDLE_ID, OLD_BUNDLE_ID) end |
.default_prefix? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
236 237 238 | # File 'os/mac/xcode.rb', line 236 def self.default_prefix? prefix.to_s == "/Applications/Xcode.app/Contents/Developer" end |
.detect_version ⇒ String?
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | # File 'os/mac/xcode.rb', line 181 def self.detect_version # This is a separate function as you can't cache the value out of a block # if return is used in the middle, which we do many times in here. return if !MacOS::Xcode.installed? && !MacOS::CLT.installed? if MacOS::Xcode.installed? # Fast path that will probably almost always work unless `xcode-select -p` is misconfigured version_plist = T.must(prefix).parent/"version.plist" if version_plist.file? data = Plist.parse_xml(version_plist, marshal: false) version = data["CFBundleShortVersionString"] if data return version if version end %W[#{prefix}/usr/bin/xcodebuild#{which("xcodebuild")}].uniq.each do |xcodebuild_path| next unless File.executable? xcodebuild_path xcodebuild_output = Utils.popen_read(xcodebuild_path, "-version") next unless $CHILD_STATUS.success? xcode_version = xcodebuild_output[/Xcode (\d+(\.\d+)*)/, 1] return xcode_version if xcode_version end end detect_version_from_clang_version end |
.detect_version_from_clang_version(version = ::DevelopmentTools.clang_version) ⇒ String
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 | # File 'os/mac/xcode.rb', line 213 def self.detect_version_from_clang_version(version = ::DevelopmentTools.clang_version) return "dunno" if version.null? # This logic provides a fake Xcode version based on the # installed CLT version. This is useful as they are packaged # simultaneously so workarounds need to apply to both based on their # comparable version. case version when "11.0.0" then "11.3.1" when "11.0.3" then "11.7" when "12.0.0" then "12.4" when "12.0.5" then "12.5.1" when "13.0.0" then "13.2.1" when "13.1.6" then "13.4.1" when "14.0.0" then "14.2" when "14.0.3" then "14.3.1" when "15.0.0" then "15.4" when "16.0.0" then "16.2" else "26.3" end end |
.installation_instructions ⇒ String
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
138 139 140 141 142 143 144 145 146 147 148 149 | # File 'os/mac/xcode.rb', line 138 def self.installation_instructions if OS::Mac.version.prerelease? <<~EOS Xcode can be installed from: #{Formatter.url(APPLE_DEVELOPER_DOWNLOAD_URL)} EOS else <<~EOS Xcode can be installed from the App Store. EOS end end |
.installed? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
118 119 120 | # File 'os/mac/xcode.rb', line 118 def self.installed? !prefix.nil? end |
.latest_sdk_version? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
61 62 63 | # File 'os/mac/xcode.rb', line 61 def self.latest_sdk_version? OS::Mac.full_version >= OS::Mac.latest_sdk_version end |
.latest_version(macos: MacOS.version) ⇒ String
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
Изменяйте эти значения, когда новая версия станет доступна в App Store и наши системы CI будут обновлены. Это может быть бета-версия для бета-версии macOS.
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # File 'os/mac/xcode.rb', line 17 def self.latest_version(macos: MacOS.version) macos = macos.strip_patch case macos when "26", "15" then "26.3" when "14" then "16.2" when "13" then "15.2" when "12" then "14.2" when "11" then "13.2.1" when "10.15" then "12.4" else raise "macOS '#{macos}' is invalid" unless macos.prerelease? # Assume matching yearly Xcode release "#{macos}.0" end end |
.minimum_version ⇒ String
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
Изменяйте эти значения, если без этого всё будет серьёзно нарушено (например, для этой версии macOS не будет SDK). Обычно это будет первый выпуск Xcode для данной версии macOS (вначале он может быть бета-версией, если эта версия macOS также находится в бета-тестировании).
39 40 41 42 43 44 45 46 47 48 49 50 51 | # File 'os/mac/xcode.rb', line 39 def self.minimum_version macos = MacOS.version case macos when "15" then "16.0" when "14" then "15.0" when "13" then "14.1" when "12" then "13.1" when "11" then "12.2" when "10.15" then "11.0" else "#{macos}.0" end end |
.needs_clt_installed? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
66 67 68 69 70 | # File 'os/mac/xcode.rb', line 66 def self.needs_clt_installed? return false if latest_sdk_version? without_clt? end |
.outdated? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
73 74 75 76 77 | # File 'os/mac/xcode.rb', line 73 def self.outdated? return false unless installed? version < latest_version end |
.prefix ⇒ ::Pathname?
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
Возвращает объект Pathname, соответствующий каталогу Developer в Xcode.app, или nil, если Xcode.app не установлен.
87 88 89 90 91 92 93 94 95 96 97 98 99 | # File 'os/mac/xcode.rb', line 87 def self.prefix @prefix ||= T.let(begin dir = MacOS.active_developer_dir if dir.empty? || dir == CLT::PKG_PATH || !File.directory?(dir) path = bundle_path path/"Contents/Developer" if path else # Use cleanpath to avoid pathological trailing slash ::Pathname.new(dir).cleanpath end end, T.nilable(::Pathname)) end |
.sdk(version = nil) ⇒ SDK?
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
128 129 130 | # File 'os/mac/xcode.rb', line 128 def self.sdk(version = nil) sdk_locator.sdk_if_applicable(version) end |
.sdk_locator ⇒ XcodeSDKLocator
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
123 124 125 | # File 'os/mac/xcode.rb', line 123 def self.sdk_locator @sdk_locator ||= T.let(XcodeSDKLocator.new, T.nilable(OS::Mac::XcodeSDKLocator)) end |
.sdk_path(version = nil) ⇒ ::Pathname?
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
133 134 135 | # File 'os/mac/xcode.rb', line 133 def self.sdk_path(version = nil) sdk(version)&.path end |
.toolchain_path ⇒ ::Pathname
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
102 103 104 | # File 'os/mac/xcode.rb', line 102 def self.toolchain_path Pathname("#{prefix}/Toolchains/XcodeDefault.xctoolchain") end |
.update_instructions ⇒ String
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
152 153 154 155 156 157 158 159 160 161 162 163 | # File 'os/mac/xcode.rb', line 152 def self.update_instructions if OS::Mac.version.prerelease? <<~EOS Xcode can be updated from: #{Formatter.url(APPLE_DEVELOPER_DOWNLOAD_URL)} EOS else <<~EOS Xcode can be updated from the App Store. EOS end end |
.version ⇒ ::Version
Этот метод является частью внутреннего API. Этот метод можно использовать только внутри репозиториев, принадлежащих Homebrew, за исключением casks и formulae. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
Получает версию Xcode.
169 170 171 172 173 174 175 176 177 178 | # File 'os/mac/xcode.rb', line 169 def self.version # may return a version string # that is guessed based on the compiler, so do not # use it in order to check if Xcode is installed. if @version ||= T.let(detect_version, T.nilable(String)) ::Version.new @version else ::Version::NULL end end |
.without_clt? ⇒ Boolean
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.
80 81 82 | # File 'os/mac/xcode.rb', line 80 def self.without_clt? !MacOS::CLT.installed? end |
© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/OS/Mac/Xcode.html