xcode-install-citrus 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
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>