xcode-install-citrus 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +33 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +16 -0
  5. data/.rubocop.yml +21 -0
  6. data/.rubocop_todo.yml +78 -0
  7. data/Gemfile +12 -0
  8. data/LICENSE +22 -0
  9. data/README.md +198 -0
  10. data/Rakefile +16 -0
  11. data/bin/xcversion +12 -0
  12. data/bin//360/237/216/211 +3 -0
  13. data/lib/xcode/install.rb +761 -0
  14. data/lib/xcode/install/cleanup.rb +14 -0
  15. data/lib/xcode/install/cli.rb +30 -0
  16. data/lib/xcode/install/command.rb +32 -0
  17. data/lib/xcode/install/install.rb +55 -0
  18. data/lib/xcode/install/installed.rb +24 -0
  19. data/lib/xcode/install/list.rb +17 -0
  20. data/lib/xcode/install/select.rb +36 -0
  21. data/lib/xcode/install/selected.rb +12 -0
  22. data/lib/xcode/install/simulators.rb +65 -0
  23. data/lib/xcode/install/uninstall.rb +36 -0
  24. data/lib/xcode/install/update.rb +14 -0
  25. data/lib/xcode/install/version.rb +3 -0
  26. data/spec/cli_spec.rb +16 -0
  27. data/spec/curl_spec.rb +26 -0
  28. data/spec/fixtures/devcenter/xcode-20150414.html +263 -0
  29. data/spec/fixtures/devcenter/xcode-20150427.html +263 -0
  30. data/spec/fixtures/devcenter/xcode-20150508.html +279 -0
  31. data/spec/fixtures/devcenter/xcode-20150601.html +212 -0
  32. data/spec/fixtures/devcenter/xcode-20150608.html +315 -0
  33. data/spec/fixtures/devcenter/xcode-20150624.html +318 -0
  34. data/spec/fixtures/devcenter/xcode-20150909.html +309 -0
  35. data/spec/fixtures/devcenter/xcode-20160601.html +1872 -0
  36. data/spec/fixtures/devcenter/xcode-20160705-alt.html +317 -0
  37. data/spec/fixtures/devcenter/xcode-20160705.html +1909 -0
  38. data/spec/fixtures/devcenter/xcode-20160922.html +878 -0
  39. data/spec/fixtures/devcenter/xcode-20161024.html +663 -0
  40. data/spec/fixtures/hdiutil.plist +31 -0
  41. data/spec/fixtures/mail-verify.html +222 -0
  42. data/spec/fixtures/not_registered_as_developer.json +11 -0
  43. data/spec/fixtures/xcode.json +1 -0
  44. data/spec/fixtures/xcode_63.json +46 -0
  45. data/spec/fixtures/yolo.json +1 -0
  46. data/spec/install_spec.rb +62 -0
  47. data/spec/installed_spec.rb +19 -0
  48. data/spec/installer_spec.rb +101 -0
  49. data/spec/json_spec.rb +32 -0
  50. data/spec/list_spec.rb +57 -0
  51. data/spec/prerelease_spec.rb +108 -0
  52. data/spec/spec_helper.rb +16 -0
  53. data/spec/uninstall_spec.rb +12 -0
  54. data/xcode-install.gemspec +32 -0
  55. metadata +195 -0
@@ -0,0 +1,14 @@
1
+ module XcodeInstall
2
+ class Command
3
+ class Cleanup < Command
4
+ self.command = 'cleanup'
5
+ self.summary = 'Cleanup cached downloads.'
6
+
7
+ def run
8
+ installer = XcodeInstall::Installer.new
9
+ return if installer.cache_dir.nil? || installer.cache_dir.to_s.length < 5
10
+ FileUtils.rm_f(Dir.glob("#{installer.cache_dir}/*"))
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ module XcodeInstall
2
+ class Command
3
+ class InstallCLITools < Command
4
+ self.command = 'install-cli-tools'
5
+ self.summary = 'Installs Xcode Command Line Tools.'
6
+
7
+ def run
8
+ if installed?
9
+ print 'Xcode CLI Tools are already installed.'
10
+ exit(0)
11
+ end
12
+ install
13
+ end
14
+
15
+ def installed?
16
+ File.exist?('/Library/Developer/CommandLineTools/usr/lib/libxcrun.dylib')
17
+ end
18
+
19
+ def install
20
+ cli_placeholder_file = '/tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress'
21
+ # create the placeholder file that's checked by CLI updates' .dist code in Apple's SUS catalog
22
+ FileUtils.touch(cli_placeholder_file)
23
+ # find the CLI Tools update
24
+ product = `softwareupdate -l | grep "\*.*Command Line" | head -n 1 | awk -F"*" '{print $2}' | sed -e 's/^ *//' | tr -d '\n'`
25
+ `softwareupdate --verbose -i "#{product}"`
26
+ FileUtils.rm(cli_placeholder_file)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ require 'claide'
2
+ require 'xcode/install/version'
3
+
4
+ module XcodeInstall
5
+ class PlainInformative < StandardError
6
+ include CLAide::InformativeError
7
+ end
8
+
9
+ class Informative < PlainInformative
10
+ def message
11
+ "[!] #{super}".ansi.red
12
+ end
13
+ end
14
+
15
+ class Command < CLAide::Command
16
+ require 'xcode/install/cleanup'
17
+ require 'xcode/install/cli'
18
+ require 'xcode/install/install'
19
+ require 'xcode/install/installed'
20
+ require 'xcode/install/list'
21
+ require 'xcode/install/select'
22
+ require 'xcode/install/selected'
23
+ require 'xcode/install/uninstall'
24
+ require 'xcode/install/update'
25
+ require 'xcode/install/simulators'
26
+
27
+ self.abstract_command = true
28
+ self.command = 'xcversion'
29
+ self.version = VERSION
30
+ self.description = 'Xcode installation manager.'
31
+ end
32
+ end
@@ -0,0 +1,55 @@
1
+ require 'uri'
2
+
3
+ module XcodeInstall
4
+ class Command
5
+ class Install < Command
6
+ self.command = 'install'
7
+ self.summary = 'Install a specific version of Xcode.'
8
+
9
+ self.arguments = [
10
+ CLAide::Argument.new('VERSION', :true)
11
+ ]
12
+
13
+ def self.options
14
+ [['--url', 'Custom Xcode DMG file path or HTTP URL.'],
15
+ ['--force', 'Install even if the same version is already installed.'],
16
+ ['--no-switch', 'Don’t switch to this version after installation'],
17
+ ['--no-install', 'Only download DMG, but do not install it.'],
18
+ ['--no-progress', 'Don’t show download progress.'],
19
+ ['--no-clean', 'Don’t delete DMG after installation.'],
20
+ ['--no-show-release-notes', 'Don’t open release notes in browser after installation.']].concat(super)
21
+ end
22
+
23
+ def initialize(argv)
24
+ @installer = Installer.new
25
+ @version = argv.shift_argument
26
+ @version ||= File.read('.xcode-version') if File.exist?('.xcode-version')
27
+ @url = argv.option('url')
28
+ @force = argv.flag?('force', false)
29
+ @should_clean = argv.flag?('clean', true)
30
+ @should_install = argv.flag?('install', true)
31
+ @should_switch = argv.flag?('switch', true)
32
+ @progress = argv.flag?('progress', true)
33
+ @show_release_notes = argv.flag?('show-release-notes', true)
34
+ super
35
+ end
36
+
37
+ def validate!
38
+ super
39
+
40
+ help! 'A VERSION argument is required.' unless @version
41
+ if @installer.installed?(@version) && !@force
42
+ print "Version #{@version} already installed."
43
+ exit(0)
44
+ end
45
+ fail Informative, "Version #{@version} doesn't exist." unless @url || @installer.exist?(@version)
46
+ fail Informative, "Invalid URL: `#{@url}`" unless !@url || @url =~ /\A#{URI.regexp}\z/
47
+ end
48
+
49
+ def run
50
+ @installer.install_version(@version, @should_switch, @should_clean, @should_install,
51
+ @progress, @url, @show_release_notes)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,24 @@
1
+ module XcodeInstall
2
+ class Command
3
+ class Installed < Command
4
+ self.command = 'installed'
5
+ self.summary = 'List installed Xcodes.'
6
+
7
+ def self.options
8
+ [['--uuid', 'Show DVTPlugInCompatibilityUUIDs in the list.']].concat(super)
9
+ end
10
+
11
+ def initialize(argv)
12
+ @uuid = argv.flag?('uuid', false)
13
+ super
14
+ end
15
+
16
+ def run
17
+ installer = XcodeInstall::Installer.new
18
+ installer.installed_versions.each do |xcode|
19
+ puts "#{xcode.version}\t(#{xcode.path})\t#{@uuid ? xcode.uuid : ''}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ module XcodeInstall
2
+ class Command
3
+ class List < Command
4
+ self.command = 'list'
5
+ self.summary = 'List Xcodes available for download.'
6
+
7
+ def self.options
8
+ [['--all', 'Show all available versions. (Default, Deprecated)']].concat(super)
9
+ end
10
+
11
+ def run
12
+ installer = XcodeInstall::Installer.new
13
+ puts installer.list
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ module XcodeInstall
2
+ class Command
3
+ class Select < Command
4
+ self.command = 'select'
5
+ self.summary = 'Select installed Xcode via `xcode-select`.'
6
+
7
+ self.arguments = [
8
+ CLAide::Argument.new('VERSION', :true)
9
+ ]
10
+
11
+ def self.options
12
+ [['--symlink', 'Update symlink in /Applications with selected Xcode']].concat(super)
13
+ end
14
+
15
+ def initialize(argv)
16
+ @installer = Installer.new
17
+ @version = argv.shift_argument
18
+ @should_symlink = argv.flag?('symlink', false)
19
+ super
20
+ end
21
+
22
+ def validate!
23
+ super
24
+
25
+ fail Informative, 'Please specify a version to select.' if @version.nil?
26
+ fail Informative, "Version #{@version} not installed." unless @installer.installed?(@version)
27
+ end
28
+
29
+ def run
30
+ xcode = @installer.installed_versions.detect { |v| v.version == @version }
31
+ `sudo xcode-select --switch #{xcode.path}`
32
+ @installer.symlink xcode.version if @should_symlink
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,12 @@
1
+ module XcodeInstall
2
+ class Command
3
+ class Selected < Command
4
+ self.command = 'selected'
5
+ self.summary = 'Show version number of currently selected Xcode.'
6
+
7
+ def run
8
+ puts `xcodebuild -version`
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,65 @@
1
+ require 'claide'
2
+
3
+ module XcodeInstall
4
+ class Command
5
+ class Simulators < Command
6
+ self.command = 'simulators'
7
+ self.summary = 'List or install iOS simulators.'
8
+
9
+ def self.options
10
+ [['--install=name', 'Install simulator beginning with name, e.g. \'iOS 8.4\', \'tvOS 9.0\'.'],
11
+ ['--force', 'Install even if the same version is already installed.'],
12
+ ['--no-install', 'Only download DMG, but do not install it.'],
13
+ ['--no-progress', 'Don’t show download progress.']].concat(super)
14
+ end
15
+
16
+ def initialize(argv)
17
+ @installed_xcodes = Installer.new.installed_versions
18
+ @install = argv.option('install')
19
+ @force = argv.flag?('force', false)
20
+ @should_install = argv.flag?('install', true)
21
+ @progress = argv.flag?('progress', true)
22
+ super
23
+ end
24
+
25
+ def run
26
+ @install ? install : list
27
+ end
28
+ end
29
+
30
+ :private
31
+
32
+ def install
33
+ filtered_simulators = @installed_xcodes.map(&:available_simulators).flatten.uniq(&:name).select do |sim|
34
+ sim.name.start_with?(@install)
35
+ end
36
+ case filtered_simulators.count
37
+ when 0
38
+ puts "[!] No simulator matching #{@install} was found. Please specify a version from the following available simulators:".ansi.red
39
+ list
40
+ exit 1
41
+ when 1
42
+ simulator = filtered_simulators.first
43
+ fail Informative, "#{simulator.name} is already installed." if simulator.installed? && !@force
44
+ puts "Installing #{simulator.name} for Xcode #{simulator.xcode.bundle_version}..."
45
+ simulator.install(@progress, @should_install)
46
+ else
47
+ puts "[!] More than one simulator matching #{@install} was found. Please specify the full version.".ansi.red
48
+ filtered_simulators.each do |candidate|
49
+ puts "Xcode #{candidate.xcode.bundle_version} (#{candidate.xcode.path})".ansi.green
50
+ puts "xcversion simulators --install=#{candidate.name}"
51
+ end
52
+ exit 1
53
+ end
54
+ end
55
+
56
+ def list
57
+ @installed_xcodes.each do |xcode|
58
+ puts "Xcode #{xcode.version} (#{xcode.path})".ansi.green
59
+ xcode.available_simulators.each do |simulator|
60
+ puts simulator.to_s
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,36 @@
1
+ module XcodeInstall
2
+ class Command
3
+ class Uninstall < Command
4
+ self.command = 'uninstall'
5
+ self.summary = 'Uninstall a specific version of Xcode.'
6
+
7
+ self.arguments = [
8
+ CLAide::Argument.new('VERSION', :true)
9
+ ]
10
+
11
+ def initialize(argv)
12
+ @installer = Installer.new
13
+ @version = argv.shift_argument
14
+ super
15
+ end
16
+
17
+ def validate!
18
+ super
19
+ help! 'A VERSION argument is required.' unless @version
20
+
21
+ fail Informative, "Version #{@version} is not installed." unless @installer.installed?(@version)
22
+ end
23
+
24
+ def run
25
+ installed_path = @installer.installed_versions.find { |x| x.version == @version }
26
+ return if installed_path.nil? || installed_path.path.nil?
27
+
28
+ `sudo rm -rf #{installed_path.path}`
29
+
30
+ return unless @installer.symlinks_to == installed_path.path
31
+ newest_version = @installer.installed_versions.last
32
+ @installer.symlink(newest_version)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,14 @@
1
+ module XcodeInstall
2
+ class Command
3
+ class Update < Command
4
+ self.command = 'update'
5
+ self.summary = 'Update cached list of available Xcodes.'
6
+
7
+ def run
8
+ installer = XcodeInstall::Installer.new
9
+ installer.rm_list_cache
10
+ installer.list
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ module XcodeInstall
2
+ VERSION = '2.5.0'.freeze
3
+ end
data/spec/cli_spec.rb ADDED
@@ -0,0 +1,16 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ module XcodeInstall
4
+ describe Command::InstallCLITools do
5
+ it 'fails if tools are already installed' do
6
+ Command::InstallCLITools.any_instance.expects(:installed?).returns(true)
7
+ -> { Command::InstallCLITools.run }.should.raise(SystemExit)
8
+ end
9
+
10
+ it 'runs if tools are not installed' do
11
+ Command::InstallCLITools.any_instance.expects(:installed?).returns(false)
12
+ Command::InstallCLITools.any_instance.expects(:install)
13
+ Command::InstallCLITools.run
14
+ end
15
+ end
16
+ end
data/spec/curl_spec.rb ADDED
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ module XcodeInstall
4
+ def self.silence_stderr
5
+ begin
6
+ orig_stderr = $stderr.clone
7
+ $stderr.reopen File.new('/dev/null', 'w')
8
+ retval = yield
9
+ ensure
10
+ $stderr.reopen orig_stderr
11
+ end
12
+ retval
13
+ end
14
+
15
+ describe Curl do
16
+ it 'reports failure' do
17
+ `true`
18
+ curl = XcodeInstall::Curl.new
19
+ result = nil
20
+ XcodeInstall.silence_stderr do
21
+ result = curl.fetch(url: 'http://0.0.0.0/test')
22
+ end
23
+ result.should == false
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,263 @@
1
+ <!DOCTYPE html>
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
5
+ <meta name="Author" content="Apple Inc." />
6
+ <meta name="viewport" content="width=1024" />
7
+ <link rel="shortcut icon" href="/favicon.ico" />
8
+ <link rel="icon" href="/favicon.ico" />
9
+ <link rel="stylesheet" href="https://www.apple.com/wss/fonts?family=Myriad+Set+Pro&v=1" type="text/css" />
10
+ <link rel="stylesheet" href="/assets/core/styles/base.css" type="text/css" />
11
+ <link rel="stylesheet" href="https://devimages.apple.com.edgekey.net/assets/core/styles/adc.css" type="text/css" />
12
+ <link rel="stylesheet" href="/assets/core/styles/templates.css" type="text/css" />
13
+ <link rel="stylesheet" href="https://devimages.apple.com.edgekey.net/assets/styles/topbar.css" type="text/css" />
14
+ <script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/lib/prototype.js" type="text/javascript" charset="utf-8"></script>
15
+ <script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/lib/scriptaculous.js" type="text/javascript" charset="utf-8"></script>
16
+ <script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/browserdetect.js" type="text/javascript" charset="utf-8"></script>
17
+ <script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/apple_core.js" type="text/javascript" charset="utf-8"></script>
18
+ <script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/search_decorator.js" type="text/javascript" charset="utf-8"></script>
19
+ <script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/adc_core.js" type="text/javascript" charset="utf-8"></script>
20
+ <script src="https://devimages.apple.com.edgekey.net/assets/scripts/ac_retina.js" type="text/javascript" charset="utf-8"></script>
21
+ <script src="https://devimages.apple.com.edgekey.net/assets/scripts/topbarDropdown.js" type="text/javascript" charset="utf-8"></script>
22
+ <script type="text/javascript">
23
+ document.write('<link rel="stylesheet" type="text/css" href="https://devimages.apple.com.edgekey.net/assets/styles/script.css" media="screen">');
24
+ </script>
25
+ <!-- Augmented Search -->
26
+ <link rel="stylesheet" href="https://devimages.apple.com.edgekey.net/assets/styles/augmented_search.css" type="text/css">
27
+ <script src="https://devimages.apple.com.edgekey.net/assets/scripts/lib/jquery/jquery-1.11.0.min.js"></script>
28
+ <script>jQuery.noConflict();</script>
29
+ <script src="https://devimages.apple.com.edgekey.net/assets/scripts/augmented_search.js"></script>
30
+ <title>Xcode - Downloads - Apple Developer</title>
31
+ <meta name="omni_page" content="Xcode Downloads and Resources - (English)">
32
+ <meta name="Description" content="Xcode includes the Xcode IDE, Instruments, iOS Simulator, the latest OS X and iOS SDKs, and more. Download Xcode and start creating apps for iOS and OS X.">
33
+ <link rel="stylesheet" href="/xcode/styles/xcode-tabs.css" type="text/css" />
34
+ <meta name="robots" content="noodp,noydir" />
35
+ <link rel="alternate" href="https://developer.apple.com/kr/xcode/downloads/" hreflang="ko-KR" />
36
+ <link rel="alternate" href="https://developer.apple.com/jp/xcode/downloads/" hreflang="ja-JP" />
37
+ <link rel="alternate" href="https://developer.apple.com/cn/xcode/downloads/" hreflang="zh-CN" />
38
+ <link rel="alternate" href="https://developer.apple.com/xcode/downloads/" hreflang="en" />
39
+ </head>
40
+ <body id="downloads" class="white">
41
+ <div id="globalheader-wrapper">
42
+ <nav id="globalheader" data-hires="true">
43
+
44
+ <h1 data-hires="true"><a href="/">Apple Developer</a></h1>
45
+ <ul id="gh-nav">
46
+ <li id="gh-nav-technologies"><a href="/technologies/">Technologies</a></li>
47
+ <li id="gh-nav-resources"><a href="/resources/">Resources</a></li>
48
+ <li id="gh-nav-programs"><a href="/programs/">Programs</a></li>
49
+ <li id="gh-nav-support"><a href="/support/">Support</a></li>
50
+ <li id="gh-nav-membercenter"><a href="/membercenter/">Member Center</a></li>
51
+ </ul>
52
+
53
+ <div id="gh-search" data-hires="true">
54
+ <form action="/search/index.php" method="get" accept-charset="utf-8"><div>
55
+ <label for="gh-adcsearch">
56
+ <span class="prettyplaceholder"></span>
57
+ <input type="text" name="q" id="gh-adcsearch" class="adcsearch prettysearch augmented">
58
+ </label>
59
+ </div></form>
60
+ </div>
61
+
62
+ <script type="text/javascript">
63
+ Event.onDOMReady(function() {
64
+ // Get root path for Global Header Active class
65
+ ghLocation = location.pathname.split('/')[1];
66
+ // Make sure it doesn't try to add a file extension to the css class
67
+ if(ghLocation.include('.')) ghLocation = ghLocation.split('.')[0];
68
+ // Add Global Header Active State Class
69
+ $$('body')[0].addClassName('gh-nav-'+location.pathname.split('/')[1]+'-active');
70
+ });
71
+ </script>
72
+ </nav>
73
+ </div>
74
+
75
+ <div id="top">
76
+ <!-- SiteCatalyst code version: H.8. Copyright 1997-2006 Omniture, Inc. -->
77
+ <script type="text/javascript">
78
+ /* RSID: */
79
+ var s_account="appleglobal,appleusdeveloper"
80
+ </script>
81
+
82
+ <script type="text/javascript" src="https://www.apple.com/metrics/scripts/s_code_h.js"></script>
83
+ <script type="text/javascript">
84
+ s.pageName=AC.Tracking.pageName();
85
+ s.channel="www.us.developer"
86
+
87
+ /************* DO NOT ALTER ANYTHING BELOW THIS LINE ! **************/
88
+ var s_code=s.t();if(s_code)document.write(s_code)</script>
89
+ <!-- End SiteCatalyst code version: H.8. -->
90
+ </div>
91
+ <div id="content" class="content" data-hires="true">
92
+
93
+ <header>
94
+ <img id="title" src="https://devimages.apple.com.edgekey.net/xcode/images/xcode-hero.png" width="856" height="130" alt="Xcode - the complete toolset for building great apps.">
95
+ </header>
96
+
97
+ <section class="layout-tabs">
98
+ <div class="tab-wrapper">
99
+ <div class="divider"></div>
100
+ <div class="grid4col tabs">
101
+ <div class="column one"><a href="/xcode/">What's New</a></div>
102
+ <div class="column two"><a href="/xcode/ide/">Xcode IDE</a></div>
103
+ <div class="column three"><a href="/xcode/interface-builder/">Interface Builder</a></div>
104
+ <div class="column four"><a href="/xcode/features/">Features</a></div>
105
+ <div class="column five active"><a href="/xcode/downloads/">Downloads</a></div>
106
+ </div>
107
+ </div>
108
+ </section>
109
+
110
+ <div class="maincontent margin-sides-40">
111
+ <section class="first">
112
+ <h2>Download Xcode for Free</h2>
113
+ </section>
114
+
115
+ <section class="download">
116
+ <img class="right padding-bottom-20" src="https://devimages.apple.com.edgekey.net/xcode/images/downloads.png" width="360" height="217" alt="" />
117
+ <h3>Xcode 6.3</h3>
118
+ <p class="width-45 margin-bottom-12">This release includes the Xcode IDE, LLVM compiler, Instruments, iOS Simulator, the latest OS X and iOS SDKs, WatchKit and the Swift 1.2 programming language.
119
+ </p>
120
+ <p class="width-45 margin-bottom-12">
121
+ Updated: Apr 8, 2015<br />
122
+ Build: 6D570<br />
123
+ SDK: iOS 8.4, OS X v10.10
124
+ </p>
125
+ <p class="width-45 margin-bottom-0">
126
+ <a class="arrow arrow-right" href="http://itunes.apple.com/us/app/xcode/id497799835?ls=1&mt=12">View in the Mac App Store</a></p>
127
+ </section>
128
+
129
+ <section class="pre-release divider-top cleared">
130
+ <img class="right padding-right-100" src="https://devimages.apple.com.edgekey.net/assets/elements/icons/128x128/xcode6-beta.png" width="128" height="128" alt="">
131
+ <h3>Xcode 6.4</h3>
132
+ <p class="width-45 margin-bottom-12">This is a pre-release version of the complete Xcode developer toolset for Mac, iPhone, iPad, and <span class="nowrap">Apple Watch.</span> This release requires <span class="nowrap">OS X Yosemite.</span>
133
+ </p>
134
+ <p class="width-45 margin-bottom-12">
135
+ Released: Apr 13, 2015<br />
136
+ Build: 6E7<br />
137
+ SDK: iOS 8.3 beta 4, OS X v10.10<br />
138
+ <ul class="links small">
139
+ <li class="dmg"><a href="/devcenter/download.action?path=/Developer_Tools/Xcode_6.4_Beta/Xcode_6.4_beta.dmg">Download Xcode 6.4</a></li>
140
+ <li class="document"><a href="/devcenter/download.action?path=/Developer_Tools/Xcode_6.4_Beta/Xcode_6.4_beta_Release_Notes.pdf">Xcode 6.4 beta Release Notes</a></li>
141
+ </ul>
142
+ </p>
143
+ </section>
144
+
145
+
146
+ <section class="related padding-top-40 divider-top">
147
+ <h2>Related Downloads and Resources</h2>
148
+
149
+ <div class="padding-top-30">
150
+ <img class="left" src="https://devimages.apple.com.edgekey.net/assets/elements/icons/64x64/downloads.png" width="64" height="64" alt="">
151
+ <h3>Additional Tools</h3>
152
+ <p>Sign in with your Apple ID to download previous versions of Xcode or additional tools from the developer downloads site. <a class="arrow arrow-right" href="/downloads/">View downloads</a></p>
153
+ </div>
154
+
155
+ <div class="padding-top-20">
156
+ <img class="left" src="https://devimages.apple.com.edgekey.net/assets/elements/icons/64x64/videos.png" width="64" height="64" alt="">
157
+ <h3>Videos</h3>
158
+ <p>Watch and learn from Apple engineers as they show how to bring the best of Apple technologies to your apps. <a class="arrow arrow-right" href="/videos/">Watch videos</a></p>
159
+ </div>
160
+
161
+ <div class="padding-top-20">
162
+ <img class="left" src="https://devimages.apple.com.edgekey.net/assets/elements/icons/64x64/library.png" width="64" height="64" alt="">
163
+ <h3>Guides and Tutorials</h3>
164
+ <p>Find a comprehensive set of programming guides, reference, and sample code for developing with the latest tools and technologies on iOS and OS X.<br /><a class="arrow arrow-right" href="/library/ios/navigation/#section=Topics&topic=Xcode">Read documentation</a></p>
165
+ </div>
166
+
167
+ <div class="padding-top-20">
168
+ <img class="left" src="https://devimages.apple.com.edgekey.net/assets/elements/icons/64x64/forum.png" width="64" height="64" alt="">
169
+ <h3>Forums</h3>
170
+ <p>Post questions and share comments about using Xcode with fellow developers.<br /><a class="arrow arrow-right" href="/devforums/">Join conversations</a></p>
171
+ </div>
172
+ </section>
173
+ </div>
174
+ </div><!-- /content -->
175
+
176
+ <div id="globalfooter">
177
+ <div id="breadory">
178
+ <ol id="breadcrumbs">
179
+ <li class="home"><a href="/">Developer</a></li>
180
+ <li><a href="/xcode/">Xcode</a></li>
181
+ <li>Downloads</li>
182
+ </ol>
183
+ <div id="directorynav" class="ipoditunes">
184
+ <div id="dn-cola" class="column first">
185
+ <h3><a href="/technologies/">What's New</a></h3>
186
+ <ul>
187
+ <li><a href="/ios8/">iOS 8</a></li>
188
+ <li><a href="/osx/whats-new/">OS X Yosemite</a></li>
189
+ <li><a href="/swift/">Swift</a></li>
190
+ <li><a href="/xcode/">Xcode 6</a></li>
191
+ </ul>
192
+ </div><!--/dn-cola-->
193
+ <div id="dn-colb" class="column">
194
+ <h3><a href="/resources/">Resources</a></h3>
195
+ <ul>
196
+ <li><a href="/devcenter/ios/index.action">iOS Dev Center</a></li>
197
+ <li><a href="/devcenter/mac/index.action">Mac Dev Center</a></li>
198
+ <li><a href="/devcenter/safari/index.action">Safari Dev Center</a></li>
199
+ <li><a href="/app-store/">App Store</a></li>
200
+ <li><a href="/iad/">iAd</a></li>
201
+ <li><a href="/icloud/">iCloud</a></li>
202
+ </ul>
203
+ </div><!--/dn-colb-->
204
+ <div id="dn-colc" class="column">
205
+ <h3 class="empty">&nbsp;</h3>
206
+ <ul>
207
+ <li><a href="/devforums/">Forums</a></li>
208
+ <li><a href="/videos/">Videos</a></li>
209
+ <li><a href="/softwarelicensing/">Licensing and Trademarks</a></li>
210
+ <li><a href="/hardwaredrivers/">Hardware and Drivers</a></li>
211
+ <li><a href="/resources/cases/">iPod, iPhone, and iPad Cases</a></li>
212
+ <li><a href="/opensource/">Open Source</a></li>
213
+ </ul>
214
+ </div><!--/dn-colc-->
215
+ <div id="dn-cold" class="column">
216
+ <h3><a href="/programs/">Programs</a></h3>
217
+ <ul>
218
+ <li><a href="/programs/ios/">iOS Developer Program</a></li>
219
+ <li><a href="/programs/ios/enterprise/">iOS Developer Enterprise Program</a></li>
220
+ <li><a href="/programs/ios/university/">iOS Developer University Program</a></li>
221
+ <li><a href="/programs/mac/">Mac Developer Program</a></li>
222
+ <li><a href="/programs/safari/">Safari Developer Program</a></li>
223
+ <li><a href="/programs/mfi/">MFi Program</a></li>
224
+ </ul>
225
+ </div><!--/dn-cold-->
226
+ <div id="dn-cole" class="column last">
227
+ <h3><a href="/support/">Support</a></h3>
228
+ <ul>
229
+ <li><a href="/support/ios/">iOS Developer Program</a></li>
230
+ <li><a href="/support/mac/">Mac Developer Program</a></li>
231
+ <li><a href="/support/safari/">Safari Developer Program</a></li>
232
+ <li><a href="/support/appstore/">App Store</a></li>
233
+ <li><a href="/support/resources/itunes-connect.html">iTunes Connect</a></li>
234
+ <li><a href="/support/technical/">Technical Support</a></li>
235
+ </ul>
236
+ </div><!--/dn-cole-->
237
+ <div class="capbottom"></div>
238
+ </div><!--/directorynav-->
239
+ </div><!--/breadory-->
240
+ <p class="gf-buy">Shop the <a href="http://www.apple.com/store/">Apple Online Store</a> (1-800-MY-APPLE), visit an <a href="http://www.apple.com/retail/">Apple Retail Store</a>, or find a <a href="http://www.apple.com/buy/locator/">reseller</a>.</p>
241
+ <ul class="gf-links piped">
242
+ <li><a href="/news/" class="first">News</a></li>
243
+ <li><a href="/register/">Register</a></li>
244
+ <li><a href="/bug-reporting/">Report Bugs</a></li>
245
+ <li><a href="/contact/">Contact Us</a></li>
246
+ </ul>
247
+ <div class="gf-sosumi">
248
+ <p>Copyright © 2015 Apple Inc. All rights reserved.</p>
249
+ <ul class="piped">
250
+ <li><a href="http://www.apple.com/legal/internet-services/terms/site.html" class="first">Terms of Use</a></li>
251
+ <li><a href="http://www.apple.com/privacy/">Privacy Policy</a></li>
252
+ </ul>
253
+ </div>
254
+ <div id="localization-links">
255
+ <ul>
256
+ <li><a href="/cn/" title="Simplified Chinese">简体中文</a></li>
257
+ <li><a href="/jp/" title="Japanese">日本語</a></li>
258
+ <li><a href="/kr/" title="Korean">한국어</a></li>
259
+ </ul>
260
+ </div>
261
+ </div><!--/globalfooter-->
262
+ </body>
263
+ </html>