sprockets-derailleur 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -22,14 +22,78 @@ Require `sprockets-derailleur` in environment file:
22
22
 
23
23
  ## Usage
24
24
 
25
- Determine how many workers you want to use first. Determine the number of physical CPUs this way:
25
+ To install to an existing rails 3.2 project, first create a new file, 'sprockets_derailleur.rb' in config/initializers.
26
26
 
27
- processes = SprocketsDerailleur::number_of_processors rescue 1
27
+ Here we need to override some core parts of the sprockets module.
28
28
 
29
- Then initialize the manifest with the workers you just determined:
29
+ ```ruby
30
+ module Sprockets
31
+ class StaticCompiler
30
32
 
31
- manifest = Sprockets::Manifest.new(Application::Sprockets, 'public/assets', processes)
33
+ alias_method :compile_without_manifest, :compile
34
+ def compile
35
+
36
+ # Determine how many workers you want to use first. Determine the number of physical CPUs this way
37
+ processes = SprocketsDerailleur::number_of_processors rescue 1
38
+
39
+ puts "Multithreading on " + processes.to_s + " processors"
40
+ puts "Starting Asset Compile: " + Time.now.getutc.to_s
41
+
42
+ # Then initialize the manifest with the workers you just determined
43
+ manifest = Sprockets::Manifest.new(env, target, processes)
44
+ manifest.compile paths
45
+
46
+ puts "Finished Asset Compile: " + Time.now.getutc.to_s
47
+
48
+ end
49
+ end
50
+
51
+ class Railtie < ::Rails::Railtie
52
+ config.after_initialize do |app|
53
+
54
+ config = app.config
55
+ next unless config.assets.enabled
56
+
57
+ if config.assets.manifest
58
+ path = File.join(config.assets.manifest, "manifest.json")
59
+ else
60
+ path = File.join(Rails.public_path, config.assets.prefix, "manifest.json")
61
+ end
62
+
63
+ if File.exist?(path)
64
+ manifest = Sprockets::Manifest.new(app, path)
65
+ config.assets.digests = manifest.assets
66
+ end
67
+
68
+ end
69
+ end
70
+
71
+ end
72
+ ```
73
+
74
+ The first block that overrides compile method starts sprockets derailleur with the chosen number of worker threads.
75
+ For maximum performance this should be the same number of processor cores on your compile machine.
76
+
77
+ The second block that is called after rails initializes is there because newer versions of sprockets are writing your
78
+ digested assets to manifest.json (Rails 4), instead of manifest.yml (Rails 3.2).
79
+
80
+ We therefore load in manifest.json using the Rails 4 method, as your asset compile will write this file. To avoid a duplicate
81
+ load, remember to delete the old manifest.yml from your public/assets folder.
82
+
83
+ A word of caution however, some gems that work with the asset pipeline still expect manifest.yml to exist.
84
+
85
+ Sprockets derailleur is known to work with (and possibly others):
86
+
87
+ - turbo-sprockets-rails3
88
+ - asset-sync
89
+
90
+ If you only intent to use digest assets, for example in production environments, you can also speed up your compile by using
91
+
92
+ ```
93
+ rake assets:precompile:primary RAILS_ENV=production
94
+ ```
32
95
 
96
+ This skips the non-digest compile, hence doubling speed (especially useful if syncing assets with a remote server).
33
97
 
34
98
  ## Contributing
35
99
 
@@ -12,10 +12,24 @@ module Sprockets
12
12
 
13
13
  alias_method :compile_with_workers, :compile
14
14
  def compile(*args)
15
+ paths_with_errors = {}
16
+
15
17
  time = Benchmark.measure do
16
18
  paths = environment.each_logical_path(*args).to_a +
17
19
  args.flatten.select { |fn| Pathname.new(fn).absolute? if fn.is_a?(String)}
18
20
 
21
+ # Skip all files without extensions, see
22
+ # https://github.com/sstephenson/sprockets/issues/347 for more info
23
+ paths = paths.select do |path|
24
+
25
+ if File.extname(path) == ""
26
+ logger.info "Skipping #{path} since it has no extension"
27
+ false
28
+ else
29
+ true
30
+ end
31
+ end
32
+
19
33
  logger.warn "Initializing #{@workers} workers"
20
34
 
21
35
  workers = []
@@ -33,10 +47,13 @@ module Sprockets
33
47
  break if finished >= paths.size
34
48
 
35
49
  ready = IO.select(reads, writes)
50
+
36
51
  ready[0].each do |readable|
37
52
  data = Marshal.load(readable)
38
53
  assets.merge! data["assets"]
39
54
  files.merge! data["files"]
55
+ paths_with_errors.merge! data["errors"]
56
+
40
57
  finished += 1
41
58
  end
42
59
 
@@ -63,6 +80,14 @@ module Sprockets
63
80
  end
64
81
 
65
82
  logger.warn "Completed compiling assets (#{(time.real * 100).round / 100.0}s)"
83
+
84
+ unless paths_with_errors.empty?
85
+ logger.warn "Asset paths with errors:"
86
+
87
+ paths_with_errors.each do |path, message|
88
+ logger.warn "\t#{path}: #{message}"
89
+ end
90
+ end
66
91
  end
67
92
 
68
93
  def worker(paths)
@@ -78,8 +103,9 @@ module Sprockets
78
103
  path = paths[Marshal.load(child_read)]
79
104
 
80
105
  time = Benchmark.measure do
106
+ data = {'assets' => {}, 'files' => {}, 'errors' => {}}
107
+
81
108
  if asset = find_asset(path)
82
- data = {'assets' => {}, 'files' => {}}
83
109
 
84
110
  data['files'][asset.digest_path] = {
85
111
  'logical_path' => asset.logical_path,
@@ -98,10 +124,14 @@ module Sprockets
98
124
  asset.write_to target
99
125
  end
100
126
 
127
+ Marshal.dump(data, child_write)
128
+ else
129
+ data['errors'][path] = "Not found"
101
130
  Marshal.dump(data, child_write)
102
131
  end
103
132
  end
104
- logger.warn "Compiled #{path} (#{(time.real * 1000).round}ms)"
133
+
134
+ logger.warn "Compiled #{path} (#{(time.real * 1000).round}ms, pid #{Process.pid})"
105
135
  end
106
136
  ensure
107
137
  child_read.close
@@ -1,5 +1,5 @@
1
1
  module Sprockets
2
2
  module Derailleur
3
- VERSION = "0.0.6"
3
+ VERSION = "0.0.7"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,46 +1,39 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sprockets-derailleur
3
- version: !ruby/object:Gem::Version
4
- hash: 19
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.7
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 6
10
- version: 0.0.6
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Steel Fu
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2013-01-15 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2013-06-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: sprockets
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
18
+ requirements:
26
19
  - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 7
29
- segments:
30
- - 2
31
- version: "2"
20
+ - !ruby/object:Gem::Version
21
+ version: '2'
32
22
  type: :runtime
33
- version_requirements: *id001
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2'
34
30
  description: Speed up sprockets compiling by forking processes
35
- email:
31
+ email:
36
32
  - steelfu@gmail.com
37
33
  executables: []
38
-
39
34
  extensions: []
40
-
41
35
  extra_rdoc_files: []
42
-
43
- files:
36
+ files:
44
37
  - .gitignore
45
38
  - Gemfile
46
39
  - LICENSE.txt
@@ -52,36 +45,26 @@ files:
52
45
  - sprockets-derailleur.gemspec
53
46
  homepage: https://github.com/steel/sprockets-derailleur
54
47
  licenses: []
55
-
56
48
  post_install_message:
57
49
  rdoc_options: []
58
-
59
- require_paths:
50
+ require_paths:
60
51
  - lib
61
- required_ruby_version: !ruby/object:Gem::Requirement
52
+ required_ruby_version: !ruby/object:Gem::Requirement
62
53
  none: false
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- hash: 3
67
- segments:
68
- - 0
69
- version: "0"
70
- required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
59
  none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- hash: 3
76
- segments:
77
- - 0
78
- version: "0"
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
79
64
  requirements: []
80
-
81
65
  rubyforge_project:
82
- rubygems_version: 1.8.24
66
+ rubygems_version: 1.8.23
83
67
  signing_key:
84
68
  specification_version: 3
85
69
  summary: Multi process sprockets compiling
86
70
  test_files: []
87
-