Модуль: Kernel Приватный
- Включён в:
- Cask::DSL::DependsOn, Dependencies, DependenciesHelpers, Homebrew::TestBot, Ignorable, Requirements, Utils::AST
- Определён в:
- extend/kernel.rb
Обзор
Этот модуль является частью закрытого API. Этот модуль можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого модуля, поскольку он может быть удалён или изменён без предупреждения.
перенести всё это в другие модули, например Utils.
Homebrew расширяет Kernel Ruby, чтобы сделать наш код более читаемым. Расширение Kernel делает эти методы доступными глобально.
Сводка констант свернуть
- IGNORE_INTERRUPTS_MUTEX =
Эта константа является частью закрытого API. Эту константу можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этой константы, поскольку она может быть удалена или изменена без предупреждения.
T.let(Thread::Mutex.new.freeze, Thread::Mutex)
Краткое описание методов экземпляра свернуть
- #ensure_executable!(name, formula_name = nil, reason: "", latest: false) ⇒ Pathname приватный
Проверяет, существует ли указанный исполняемый файл, и, если нет, устанавливает версию из Homebrew.
- #exec_browser(*args) ⇒ void приватный
- #exec_editor(*filenames) ⇒ void приватный
- #ignore_interrupts(&_block) ⇒ T.type_parameter(:U) приватный
- #interactive_shell(formula = nil) ⇒ void приватный
- #quiet_system(cmd, argv0 = nil, *args) ⇒ Boolean внутренний
Выполняет системную команду без вывода.
- #redirect_stdout(file, &_block) ⇒ T.type_parameter(:U) приватный
- #safe_system(cmd, argv0 = nil, *args, **options) ⇒ void приватный
Kernel.system, но с исключениями.
- #which(cmd, path = ENV.fetch("PATH")) ⇒ Pathname?
Находит команду.
- #which_editor(silent: false) ⇒ String приватный
- #with_env(hash, &_block) ⇒ T.type_parameter(:U)
Вызывает переданный блок, добавив переданные переменные окружения в
ENV, а затем восстанавливаетENV. - #with_homebrew_path(&block) ⇒ T.type_parameter(:U) приватный
Подробное описание методов экземпляра
#ensure_executable!(name, formula_name = nil, reason: "", latest: false) ⇒ Pathname
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.
Проверяет, существует ли указанный исполняемый файл, и в противном случае устанавливает версию из Homebrew
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | # File 'extend/kernel.rb', line 185 def ensure_executable!(name, formula_name = nil, reason: "", latest: false) formula_name ||= name executable = [ which(name), which(name, ORIGINAL_PATHS), # We prefer the opt_bin path to a formula's executable over the prefix # path where available, since the former is stable during upgrades. HOMEBREW_PREFIX/"opt/#{formula_name}/bin/#{name}", HOMEBREW_PREFIX/"bin/#{name}", ].compact.find(&:exist?) return executable if executable require "formula" T.cast(Formula[formula_name].ensure_installed!(reason:, latest:, executable: name), Pathname) end |
#exec_browser(*args) ⇒ void
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.
Этот метод не возвращает значения.
134 135 136 137 138 139 140 141 142 143 144 | # File 'extend/kernel.rb', line 134 def exec_browser(*args) browser = Homebrew::EnvConfig.browser browser ||= OS::PATH_OPEN if defined?(OS::PATH_OPEN) return unless browser ENV["DISPLAY"] = Homebrew::EnvConfig.display with_env(DBUS_SESSION_BUS_ADDRESS: ENV.fetch("HOMEBREW_DBUS_SESSION_BUS_ADDRESS", nil)) do safe_system(browser, *args) end end |
#exec_editor(*filenames) ⇒ void
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.
Этот метод не возвращает значения.
128 129 130 131 | # File 'extend/kernel.rb', line 128 def exec_editor(*filenames) puts "Editing #{filenames.join "\n"}" with_homebrew_path { safe_system(*which_editor.shellsplit, *filenames) } end |
#ignore_interrupts(&_block) ⇒ T.type_parameter(:U)
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | # File 'extend/kernel.rb', line 149 def ignore_interrupts(&_block) IGNORE_INTERRUPTS_MUTEX.synchronize do interrupted = T.let(false, T::Boolean) old_sigint_handler = trap(:INT) do interrupted = true $stderr.print "\n" $stderr.puts "One sec, cleaning up..." end begin yield ensure trap(:INT, old_sigint_handler) raise Interrupt if interrupted end end end |
#interactive_shell(formula = nil) ⇒ void
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.
Этот метод не возвращает значения.
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | # File 'extend/kernel.rb', line 19 def interactive_shell(formula = nil) unless formula.nil? ENV["HOMEBREW_DEBUG_PREFIX"] = formula.prefix.to_s ENV["HOMEBREW_DEBUG_INSTALL"] = formula.full_name end if Utils::Shell.preferred == :zsh && (home = Dir.home).start_with?(HOMEBREW_TEMP.resolved_path.to_s) FileUtils.mkdir_p home FileUtils.touch "#{home}/.zshrc" end term = ENV.fetch("HOMEBREW_TERM", ENV.fetch("TERM", nil)) with_env(TERM: term) do Process.wait fork { exec Utils::Shell.preferred_path(default: "/bin/bash") } end return if $CHILD_STATUS.success? raise "Aborted due to non-zero exit status (#{$CHILD_STATUS.exitstatus})" if $CHILD_STATUS.exited? raise $CHILD_STATUS.inspect end |
#quiet_system(cmd, argv0 = nil, *args) ⇒ Boolean
Этот метод является частью внутреннего API. Этот метод можно использовать только внутри репозиториев, принадлежащих Homebrew, за исключением casks и formulae. По возможности сторонним разработчикам не следует использовать этот метод, так как он может быть удалён или изменён без предупреждения.
Выполняет системную команду без вывода.
74 75 76 77 78 79 80 81 82 83 84 | # File 'extend/kernel.rb', line 74 def quiet_system(cmd, argv0 = nil, *args) # TODO: migrate to utils.rb Homebrew.quiet_system require "utils" Homebrew._system(cmd, argv0, *args) do # Redirect output streams to `/dev/null` instead of closing as some programs # will fail to execute if they can't write to an open stream. $stdout.reopen(File::NULL) $stderr.reopen(File::NULL) end end |
#redirect_stdout(file, &_block) ⇒ T.type_parameter(:U)
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, так как он может быть удалён или изменён без предупреждения.
174 175 176 177 178 179 180 181 | # File 'extend/kernel.rb', line 174 def redirect_stdout(file, &_block) out = $stdout.dup $stdout.reopen(file) yield ensure $stdout.reopen(out) out.close end |
#safe_system(cmd, argv0 = nil, *args, **options) ⇒ void
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, так как он может быть удалён или изменён без предупреждения.
Этот метод не возвращает определённого значения.
Аналог Kernel.system, но с генерацией исключений.
55 56 57 58 59 60 61 62 | # File 'extend/kernel.rb', line 55 def safe_system(cmd, argv0 = nil, *args, **) # TODO: migrate to utils.rb Homebrew.safe_system require "utils" return if Homebrew.system(cmd, argv0, *args, **) raise ErrorDuringExecution.new([cmd, argv0, *args], status: $CHILD_STATUS) end |
#which(cmd, path = ENV.fetch("PATH")) ⇒ Pathname?
Найти команду.
Синхронизируйте с which в Library/Homebrew/utils.sh.
91 92 93 94 95 96 97 98 99 100 101 102 103 | # File 'extend/kernel.rb', line 91 def which(cmd, path = ENV.fetch("PATH")) PATH.new(path).each do |p| begin pcmd = File.(cmd, p) rescue ArgumentError # File.expand_path will raise an ArgumentError if the path is malformed. # See https://github.com/Homebrew/legacy-homebrew/issues/32789 next end return Pathname.new(pcmd) if File.file?(pcmd) && File.executable?(pcmd) end nil end |
#which_editor(silent: false) ⇒ String
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | # File 'extend/kernel.rb', line 106 def which_editor(silent: false) editor = Homebrew::EnvConfig.editor return editor if editor # Find VS Code variants, Sublime Text, Textmate, BBEdit, or vim editor = %w[codecodiumcursorcode-insiderssublmatebbeditvim].find do |candidate| candidate if which(candidate, ORIGINAL_PATHS) end editor ||= "vim" unless silent Utils::Output.opoo <<~EOS Using #{editor} because no editor was set in the environment. This may change in the future, so we recommend setting `$EDITOR` or `$HOMEBREW_EDITOR` to your preferred text editor. EOS end editor end |
#with_env(hash, &_block) ⇒ T.type_parameter(:U)
Этот метод не является потокобезопасным: другие потоки, выполнение которых будет запланировано во время блока, также увидят эти переменные окружения.
Вызывает переданный блок, добавив указанные переменные окружения в ENV, а затем восстанавливает ENV.
Пример
with_env(PATH: "/bin") do
system "echo $PATH"
end
225 226 227 228 229 230 231 232 233 234 235 236 237 238 | # File 'extend/kernel.rb', line 225 def with_env(hash, &_block) old_values = {} begin hash.each do |key, value| key = key.to_s old_values[key] = ENV.delete(key) ENV[key] = value&.to_s end yield ensure ENV.update(old_values) end end |
#with_homebrew_path(&block) ⇒ T.type_parameter(:U)
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
42 43 44 | # File 'extend/kernel.rb', line 42 def with_homebrew_path(&block) with_env(PATH: PATH.new(ORIGINAL_PATHS).to_s, &block) end |
© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/Kernel.html