Spec-Zone.ru › Homebrew

Модуль: 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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Boolean)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (::Pathname, nil)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Boolean)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (String, nil)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • version (::Version) (по умолчанию: ::DevelopmentTools.clang_version)

Возвращает:

  • (String)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (String)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Boolean)


118
119
120
# File 'os/mac/xcode.rb', line 118

def self.installed?
  !prefix.nil?
end

.latest_sdk_version? ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Boolean)


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.

Параметры:

  • macos (MacOSVersion) (по умолчанию: MacOS.version)

Возвращает:

  • (String)


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 также находится в бета-тестировании).

Возвращает:

  • (String)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Boolean)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Boolean)


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 не установлен.

Возвращает:

  • (::Pathname, nil)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • version (MacOSVersion, nil) (по умолчанию: nil)

Возвращает:

  • (SDK, nil)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (XcodeSDKLocator)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • version (MacOSVersion, nil) (по умолчанию: nil)

Возвращает:

  • (::Pathname, nil)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (::Pathname)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (String)


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.

Возвращает:

  • (::Version)


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. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Boolean)


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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API