berkshelf 0.1.5 → 0.2.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.
- data/README.md +43 -0
- data/berkshelf.gemspec +1 -0
- data/features/install.feature +17 -0
- data/features/step_definitions/cli_steps.rb +5 -1
- data/lib/berkshelf/berksfile.rb +28 -1
- data/lib/berkshelf/cookbook_source/git_location.rb +1 -1
- data/lib/berkshelf/core_ext/fileutils.rb +80 -0
- data/lib/berkshelf/thor.rb +1 -1
- data/lib/berkshelf/version.rb +1 -1
- data/lib/chef/knife/berks_install.rb +21 -6
- data/spec/unit/berkshelf/{cookbookfile_spec.rb → berksfile_spec.rb} +38 -0
- metadata +23 -6
- data/README.rdoc +0 -102
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Berkshelf
|
2
|
+
|
3
|
+
Manage a Cookbook or an Application's Cookbook dependencies
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
$ gem install berkshelf
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
See [berkshelf.com](http://berkshelf.com) for up-to-date usage instructions.
|
12
|
+
|
13
|
+
# Contributing
|
14
|
+
|
15
|
+
## Running tests
|
16
|
+
|
17
|
+
### Install prerequisites
|
18
|
+
|
19
|
+
Install the latest version of {Bundler}[http://gembundler.com]
|
20
|
+
|
21
|
+
$ gem install bundler
|
22
|
+
|
23
|
+
Clone the project
|
24
|
+
|
25
|
+
$ git clone git://github.com/RiotGames/berkshelf.git
|
26
|
+
|
27
|
+
and run:
|
28
|
+
|
29
|
+
$ cd berkshelf
|
30
|
+
$ bundle install
|
31
|
+
|
32
|
+
Bundler will install all gems and their dependencies required for testing and developing.
|
33
|
+
|
34
|
+
### Running unit (RSpec) and acceptance (Cucumber) tests
|
35
|
+
|
36
|
+
$ bundle exec guard start
|
37
|
+
|
38
|
+
# Authors and Contributors
|
39
|
+
|
40
|
+
* Josiah Kiehl (<josiah@skirmisher.net>)
|
41
|
+
* Jamie Winsor (<jamie@vialstudios.com>)
|
42
|
+
* Erik Hollensbe (<erik@hollensbe.org>)
|
43
|
+
* Michael Ivey (<ivey@gweezlebur.com>)
|
data/berkshelf.gemspec
CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_runtime_dependency 'minitar'
|
22
22
|
s.add_runtime_dependency 'thor', '~> 0.15.2'
|
23
23
|
|
24
|
+
s.add_development_dependency 'redcarpet'
|
24
25
|
s.add_development_dependency 'cucumber'
|
25
26
|
s.add_development_dependency 'vcr'
|
26
27
|
s.add_development_dependency 'webmock'
|
data/features/install.feature
CHANGED
@@ -53,3 +53,20 @@ Feature: install cookbooks from a Berksfile
|
|
53
53
|
Cookbook 'doesntexist' not found at site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
|
54
54
|
"""
|
55
55
|
And the CLI should exit with the status code for error "DownloadFailure"
|
56
|
+
|
57
|
+
@wip
|
58
|
+
Scenario: running install command with the --shims flag to create a directory of shims
|
59
|
+
Given I write to "Berksfile" with:
|
60
|
+
"""
|
61
|
+
cookbook "mysql", "1.2.4"
|
62
|
+
"""
|
63
|
+
When I run the install command with flags:
|
64
|
+
| --shims |
|
65
|
+
Then the following directories should exist:
|
66
|
+
| cookbooks |
|
67
|
+
| cookbooks/mysql |
|
68
|
+
And the output should contain:
|
69
|
+
"""
|
70
|
+
Shims written to:
|
71
|
+
"""
|
72
|
+
And the exit status should be 0
|
@@ -39,7 +39,11 @@ When /^I run the init command with no value for the target$/ do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
When /^I run the install command$/ do
|
42
|
-
run_simple(unescape("knife berks install"),
|
42
|
+
run_simple(unescape("knife berks install"), true)
|
43
|
+
end
|
44
|
+
|
45
|
+
When /^I run the install command with flags:$/ do |flags|
|
46
|
+
run_simple(unescape("knife berks install #{flags.raw.join(" ")}"), true)
|
43
47
|
end
|
44
48
|
|
45
49
|
When /^I run the update command$/ do
|
data/lib/berkshelf/berksfile.rb
CHANGED
@@ -119,9 +119,16 @@ module Berkshelf
|
|
119
119
|
# @option options [Symbol, Array] :without
|
120
120
|
# Group(s) to exclude which will cause any sources marked as a member of the
|
121
121
|
# group to not be installed
|
122
|
+
# @option options [String, Pathname] :shims
|
123
|
+
# Path to a directory of shims each pointing to a Cookbook Version that is
|
124
|
+
# part of the dependency solution. Each shim is a hard link on disk.
|
122
125
|
def install(options = {})
|
123
126
|
resolver = Resolver.new(Berkshelf.downloader, sources(exclude: options[:without]))
|
124
|
-
resolver.resolve
|
127
|
+
solution = resolver.resolve
|
128
|
+
if options[:shims]
|
129
|
+
write_shims(options[:shims], solution)
|
130
|
+
Berkshelf.ui.info "Shims written to: '#{options[:shims]}'"
|
131
|
+
end
|
125
132
|
write_lockfile(resolver.sources) unless lockfile_present?
|
126
133
|
end
|
127
134
|
|
@@ -152,6 +159,26 @@ module Berkshelf
|
|
152
159
|
end
|
153
160
|
end
|
154
161
|
|
162
|
+
# Write a collection of hard links to the given path representing the given
|
163
|
+
# CachedCookbooks. Useful for getting Cookbooks in a single location for
|
164
|
+
# consumption by Vagrant, or another tool that expect this structure.
|
165
|
+
#
|
166
|
+
# @example
|
167
|
+
# Given the path: '/Users/reset/code/pvpnet/cookbooks'
|
168
|
+
# And a CachedCookbook: 'nginx' verison '0.100.5' at '/Users/reset/.berkshelf/nginx-0.100.5'
|
169
|
+
#
|
170
|
+
# A hardlink will be created at: '/Users/reset/code/pvpnet/cookbooks/nginx'
|
171
|
+
#
|
172
|
+
# @param [Pathname, String] path
|
173
|
+
# @param [Array<Berkshelf::CachedCookbook>] cached_cookbooks
|
174
|
+
def write_shims(path, cached_cookbooks)
|
175
|
+
FileUtils.mkdir_p(path)
|
176
|
+
cached_cookbooks.each do |cached_cookbook|
|
177
|
+
destination = File.join(path, cached_cookbook.cookbook_name)
|
178
|
+
FileUtils.ln_r(cached_cookbook.path, destination, force: true)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
155
182
|
private
|
156
183
|
|
157
184
|
def lockfile_present?
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module FileUtils
|
2
|
+
# @note taken from proposed FileUtils feature:
|
3
|
+
# @note {http://redmine.ruby-lang.org/issues/show/4189}
|
4
|
+
# @note {https://github.com/ruby/ruby/pull/4}
|
5
|
+
#
|
6
|
+
# Options: noop verbose dereference_root force
|
7
|
+
#
|
8
|
+
# Hard link +src+ to +dest+. If +src+ is a directory, this method links
|
9
|
+
# all its contents recursively. If +dest+ is a directory, links
|
10
|
+
# +src+ to +dest/src+.
|
11
|
+
#
|
12
|
+
# +src+ can be a list of files.
|
13
|
+
#
|
14
|
+
# # Installing ruby library "mylib" under the site_ruby
|
15
|
+
# FileUtils.rm_r site_ruby + '/mylib', :force
|
16
|
+
# FileUtils.ln_r 'lib/', site_ruby + '/mylib'
|
17
|
+
#
|
18
|
+
# # Examples of copying several files to target directory.
|
19
|
+
# FileUtils.ln_r %w(mail.rb field.rb debug/), site_ruby + '/tmail'
|
20
|
+
# FileUtils.ln_r Dir.glob('*.rb'), '/home/aamine/lib/ruby', :noop => true, :verbose => true
|
21
|
+
#
|
22
|
+
# # If you want to copy all contents of a directory instead of the
|
23
|
+
# # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
|
24
|
+
# # use following code.
|
25
|
+
# FileUtils.ln_r 'src/.', 'dest' # cp_r('src', 'dest') makes src/dest,
|
26
|
+
# # but this doesn't.
|
27
|
+
def ln_r(src, dest, options = {})
|
28
|
+
fu_check_options options, OPT_TABLE['ln_r']
|
29
|
+
fu_output_message "ln -r#{options[:force] ? ' --remove-destination' : ''} #{[src,dest].flatten.join ' '}" if options[:verbose]
|
30
|
+
return if options[:noop]
|
31
|
+
options = options.dup
|
32
|
+
options[:dereference_root] = true unless options.key?(:dereference_root)
|
33
|
+
fu_each_src_dest(src, dest) do |s, d|
|
34
|
+
link_entry s, d, options[:dereference_root], options[:force]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
module_function :ln_r
|
38
|
+
|
39
|
+
OPT_TABLE['ln_r'] = [:noop, :verbose, :dereference_root, :force]
|
40
|
+
|
41
|
+
#
|
42
|
+
# Hard links a file system entry +src+ to +dest+.
|
43
|
+
# If +src+ is a directory, this method links its contents recursively.
|
44
|
+
#
|
45
|
+
# Both of +src+ and +dest+ must be a path name.
|
46
|
+
# +src+ must exist, +dest+ must not exist.
|
47
|
+
#
|
48
|
+
# If +dereference_root+ is true, this method dereference tree root.
|
49
|
+
#
|
50
|
+
# If +force+ is true, this method removes each destination file before copy.
|
51
|
+
#
|
52
|
+
def link_entry(src, dest, dereference_root = false, force = false)
|
53
|
+
Entry_.new(src, nil, dereference_root).traverse do |ent|
|
54
|
+
destent = Entry_.new(dest, ent.rel, false)
|
55
|
+
File.unlink destent.path if force && File.file?(destent.path)
|
56
|
+
ent.link destent.path
|
57
|
+
end
|
58
|
+
end
|
59
|
+
module_function :link_entry
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
class Entry_ #:nodoc:
|
64
|
+
def link(dest)
|
65
|
+
case
|
66
|
+
when directory?
|
67
|
+
if !File.exist?(dest) and descendant_diretory?(dest, path)
|
68
|
+
raise ArgumentError, "cannot link directory %s to itself %s" % [path, dest]
|
69
|
+
end
|
70
|
+
begin
|
71
|
+
Dir.mkdir dest
|
72
|
+
rescue
|
73
|
+
raise unless File.directory?(dest)
|
74
|
+
end
|
75
|
+
else
|
76
|
+
File.link path(), dest
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/berkshelf/thor.rb
CHANGED
@@ -22,7 +22,7 @@ module Berkshelf
|
|
22
22
|
type: :boolean,
|
23
23
|
desc: "Freeze the uploaded cookbooks so that they cannot be overwritten.",
|
24
24
|
default: false
|
25
|
-
desc "upload", "
|
25
|
+
desc "upload", "Upload the sources defined in your Berksfile and their dependencies to a Chef Server."
|
26
26
|
def upload
|
27
27
|
begin
|
28
28
|
Chef::Config.from_file(File.expand_path(options[:config]))
|
data/lib/berkshelf/version.rb
CHANGED
@@ -8,20 +8,35 @@ module Berkshelf
|
|
8
8
|
|
9
9
|
banner "knife berks install (options)"
|
10
10
|
|
11
|
+
option :shims,
|
12
|
+
short: "-s",
|
13
|
+
long: "--shims",
|
14
|
+
description: "Create a directory of shims pointing to Cookbook Versions.",
|
15
|
+
boolean: true
|
11
16
|
option :without,
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
|
17
|
+
short: "-W WITHOUT",
|
18
|
+
long: "--without WITHOUT",
|
19
|
+
description: "Exclude cookbooks that are in these groups",
|
20
|
+
proc: lambda { |w| w.split(",") },
|
21
|
+
default: Array.new
|
18
22
|
def run
|
19
23
|
::Berkshelf.ui = ui
|
24
|
+
# JW TODO: replace knife with Thor bin. Opt parsing here isn't my favorite.
|
25
|
+
if config[:shims]
|
26
|
+
config[:shims] = shims_path
|
27
|
+
end
|
28
|
+
|
20
29
|
cookbook_file = ::Berkshelf::Berksfile.from_file(File.join(Dir.pwd, Berkshelf::DEFAULT_FILENAME))
|
21
30
|
cookbook_file.install(config)
|
22
31
|
rescue BerkshelfError => e
|
23
32
|
Berkshelf.ui.fatal e
|
24
33
|
exit e.status_code
|
25
34
|
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def shims_path
|
39
|
+
File.join(Dir.pwd, "cookbooks")
|
40
|
+
end
|
26
41
|
end
|
27
42
|
end
|
@@ -155,6 +155,44 @@ EOF
|
|
155
155
|
subject.install
|
156
156
|
end
|
157
157
|
end
|
158
|
+
|
159
|
+
context "when given a value for :shims pointing to a valid path"do
|
160
|
+
let(:cached_one) { double('cached_one', cookbook_name: 'nginx', path: fixtures_path.join("cookbooks", "nginx-0.100.5")) }
|
161
|
+
let(:cached_two) { double('cached_two', cookbook_name: 'example_cookbook', path: fixtures_path.join("cookbooks", "example_cookbook-0.5.0")) }
|
162
|
+
let(:shims_path) { tmp_path.join("cookbook_shims") }
|
163
|
+
|
164
|
+
before(:each) do
|
165
|
+
resolver.stub(:resolve).and_return([cached_one, cached_two])
|
166
|
+
end
|
167
|
+
|
168
|
+
it "sends a message to write_shims with the given directory and the resolver's solution" do
|
169
|
+
subject.should_receive(:write_shims).with(shims_path, [cached_one, cached_two])
|
170
|
+
subject.install(shims: shims_path)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe "#write_shims" do
|
176
|
+
let(:cached_one) { double('cached_one', cookbook_name: 'nginx', path: fixtures_path.join("cookbooks", "nginx-0.100.5")) }
|
177
|
+
let(:cached_two) { double('cached_two', cookbook_name: 'example_cookbook', path: fixtures_path.join("cookbooks", "example_cookbook-0.5.0")) }
|
178
|
+
let(:shims_path) { tmp_path.join("cookbook_shims") }
|
179
|
+
|
180
|
+
before(:each) { subject.write_shims(shims_path, [cached_one, cached_two]) }
|
181
|
+
|
182
|
+
it "writes a directory at the given path" do
|
183
|
+
shims_path.should exist
|
184
|
+
shims_path.should be_directory
|
185
|
+
end
|
186
|
+
|
187
|
+
it "writes a symlink of the name of each source within the given directory" do
|
188
|
+
linked_path_one = shims_path.join(cached_one.cookbook_name)
|
189
|
+
linked_path_two = shims_path.join(cached_two.cookbook_name)
|
190
|
+
|
191
|
+
linked_path_one.should exist
|
192
|
+
linked_path_one.should be_cookbook
|
193
|
+
linked_path_two.should exist
|
194
|
+
linked_path_two.should be_cookbook
|
195
|
+
end
|
158
196
|
end
|
159
197
|
end
|
160
198
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berkshelf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2012-06-
|
15
|
+
date: 2012-06-24 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: dep_selector
|
@@ -78,6 +78,22 @@ dependencies:
|
|
78
78
|
- - ~>
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: 0.15.2
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: redcarpet
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
type: :development
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
81
97
|
- !ruby/object:Gem::Dependency
|
82
98
|
name: cucumber
|
83
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -333,7 +349,7 @@ files:
|
|
333
349
|
- Gemfile
|
334
350
|
- Guardfile
|
335
351
|
- LICENSE
|
336
|
-
- README.
|
352
|
+
- README.md
|
337
353
|
- Thorfile
|
338
354
|
- berkshelf.gemspec
|
339
355
|
- features/config.sample.yml
|
@@ -358,6 +374,7 @@ files:
|
|
358
374
|
- lib/berkshelf/cookbook_store.rb
|
359
375
|
- lib/berkshelf/core_ext.rb
|
360
376
|
- lib/berkshelf/core_ext/file.rb
|
377
|
+
- lib/berkshelf/core_ext/fileutils.rb
|
361
378
|
- lib/berkshelf/core_ext/kernel.rb
|
362
379
|
- lib/berkshelf/core_ext/pathname.rb
|
363
380
|
- lib/berkshelf/downloader.rb
|
@@ -405,13 +422,13 @@ files:
|
|
405
422
|
- spec/support/chef_api.rb
|
406
423
|
- spec/support/matchers/file_system_matchers.rb
|
407
424
|
- spec/support/matchers/filepath_matchers.rb
|
425
|
+
- spec/unit/berkshelf/berksfile_spec.rb
|
408
426
|
- spec/unit/berkshelf/cached_cookbook_spec.rb
|
409
427
|
- spec/unit/berkshelf/cookbook_source/git_location_spec.rb
|
410
428
|
- spec/unit/berkshelf/cookbook_source/path_location_spec.rb
|
411
429
|
- spec/unit/berkshelf/cookbook_source/site_location_spec.rb
|
412
430
|
- spec/unit/berkshelf/cookbook_source_spec.rb
|
413
431
|
- spec/unit/berkshelf/cookbook_store_spec.rb
|
414
|
-
- spec/unit/berkshelf/cookbookfile_spec.rb
|
415
432
|
- spec/unit/berkshelf/downloader_spec.rb
|
416
433
|
- spec/unit/berkshelf/dsl_spec.rb
|
417
434
|
- spec/unit/berkshelf/git_spec.rb
|
@@ -442,7 +459,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
442
459
|
version: '0'
|
443
460
|
segments:
|
444
461
|
- 0
|
445
|
-
hash:
|
462
|
+
hash: -3927630543327707547
|
446
463
|
requirements: []
|
447
464
|
rubyforge_project:
|
448
465
|
rubygems_version: 1.8.23
|
@@ -489,13 +506,13 @@ test_files:
|
|
489
506
|
- spec/support/chef_api.rb
|
490
507
|
- spec/support/matchers/file_system_matchers.rb
|
491
508
|
- spec/support/matchers/filepath_matchers.rb
|
509
|
+
- spec/unit/berkshelf/berksfile_spec.rb
|
492
510
|
- spec/unit/berkshelf/cached_cookbook_spec.rb
|
493
511
|
- spec/unit/berkshelf/cookbook_source/git_location_spec.rb
|
494
512
|
- spec/unit/berkshelf/cookbook_source/path_location_spec.rb
|
495
513
|
- spec/unit/berkshelf/cookbook_source/site_location_spec.rb
|
496
514
|
- spec/unit/berkshelf/cookbook_source_spec.rb
|
497
515
|
- spec/unit/berkshelf/cookbook_store_spec.rb
|
498
|
-
- spec/unit/berkshelf/cookbookfile_spec.rb
|
499
516
|
- spec/unit/berkshelf/downloader_spec.rb
|
500
517
|
- spec/unit/berkshelf/dsl_spec.rb
|
501
518
|
- spec/unit/berkshelf/git_spec.rb
|
data/README.rdoc
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
= Berkshelf
|
2
|
-
|
3
|
-
Manages a Cookbook's, or an Application's, Cookbook dependencies
|
4
|
-
|
5
|
-
== Getting Started
|
6
|
-
|
7
|
-
=== Install
|
8
|
-
|
9
|
-
$ gem install berkshelf
|
10
|
-
|
11
|
-
=== Use
|
12
|
-
|
13
|
-
==== Berksfile
|
14
|
-
|
15
|
-
Dependencies are managed via a `Berksfile` in the directory where you want the cookbooks to be installed. The Berksfile, like Bundler's Gemfile, contains which cookbooks are needed and, optionally, where to find them:
|
16
|
-
|
17
|
-
cookbook 'memcached'
|
18
|
-
cookbook 'nginx'
|
19
|
-
cookbook 'my_app', path: '/path/to/cookbook'
|
20
|
-
cookbook 'mysql', git: 'git://github.com/opscode-cookbooks/mysql.git'
|
21
|
-
|
22
|
-
==== CLI
|
23
|
-
|
24
|
-
The CLI consists of 2 commands: install, update
|
25
|
-
|
26
|
-
$ knife berks (install|update) [(--without|-W) group_to_exclude]
|
27
|
-
|
28
|
-
[install] Installs the from the Berksfile.lock, or Berksfile if the the lockfile does not exist.
|
29
|
-
|
30
|
-
[update] Skips the lockfile and installs fresh
|
31
|
-
|
32
|
-
[init] Prepares a local path to have it's Cookbook dependencies managed by Berkshelf. If the target path is a Cookbook itself, additional Berkshelf support files will be generated to get you started.
|
33
|
-
|
34
|
-
== The Berksfile
|
35
|
-
|
36
|
-
Cookbooks are defined as dependencies by declaring them in the `Berksfile`
|
37
|
-
|
38
|
-
cookbook 'nginx'
|
39
|
-
|
40
|
-
Cookbooks without additional options are assumed to come from the Opscode Community site at the latest available version: http://community.opscode.com/cookbooks
|
41
|
-
|
42
|
-
Options available include:
|
43
|
-
|
44
|
-
version constraint
|
45
|
-
|
46
|
-
cookbook "nginx", "= 0.101.2" # precisely 0.101.2
|
47
|
-
cookbook "mysql", "< 1.2.4" # less than and not including 1.2.4
|
48
|
-
cookbook "openssl", "~> 1.0.0" # greater than 1.0.0, and up to but not including 1.1.0
|
49
|
-
|
50
|
-
git
|
51
|
-
|
52
|
-
# ref can be a branch name, tag, or commit hash. If ref is not provided, HEAD is used.
|
53
|
-
cookbook "mysql", git: "https://github.com/opscode-cookbooks/mysql.git", ref: "<any git ref>"
|
54
|
-
|
55
|
-
path
|
56
|
-
|
57
|
-
# knife berks will look in /path/to/location/of/my_application for the cookbook
|
58
|
-
cookbook "my_application", path: "/path/to/location/of"
|
59
|
-
|
60
|
-
=== Groups
|
61
|
-
|
62
|
-
Groups can be defined via blocks or inline as an option:
|
63
|
-
|
64
|
-
group :solo do
|
65
|
-
cookbook 'base'
|
66
|
-
end
|
67
|
-
|
68
|
-
cookbook 'base', :group => 'solo'
|
69
|
-
|
70
|
-
When using install or update, groups can be excluded with the --without GROUP_NAME or -W GROUP_NAME flags.
|
71
|
-
|
72
|
-
= Contributing
|
73
|
-
|
74
|
-
== Running tests
|
75
|
-
|
76
|
-
=== Install prerequisites
|
77
|
-
|
78
|
-
Install the latest version of {Bundler}[http://gembundler.com]
|
79
|
-
|
80
|
-
$ gem install bundler
|
81
|
-
|
82
|
-
Clone the project
|
83
|
-
|
84
|
-
$ git clone git://github.com/RiotGames/berkshelf.git
|
85
|
-
|
86
|
-
and run:
|
87
|
-
|
88
|
-
$ cd berkshelf
|
89
|
-
$ bundle install
|
90
|
-
|
91
|
-
Bundler will install all gems and their dependencies required for testing and developing.
|
92
|
-
|
93
|
-
=== Running unit (RSpec) and acceptance (Cucumber) tests
|
94
|
-
|
95
|
-
$ bundle exec guard start
|
96
|
-
|
97
|
-
= Authors and Contributors
|
98
|
-
|
99
|
-
* Josiah Kiehl (<josiah@skirmisher.net>)
|
100
|
-
* Jamie Winsor (<jamie@vialstudios.com>)
|
101
|
-
* Erik Hollensbe (<erik@hollensbe.org>)
|
102
|
-
* Michael Ivey (<ivey@gweezlebur.com>)
|