dep_walker 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +13 -0
- data/.gemtest +0 -0
- data/History.rdoc +6 -0
- data/Manifest.txt +12 -0
- data/README.rdoc +88 -0
- data/Rakefile +22 -0
- data/bin/dep_walker +76 -0
- data/ext/dep_walker/dep_walker.c +18 -0
- data/ext/dep_walker/extconf.rb +11 -0
- data/ext/dep_walker/win.c +64 -0
- data/ext/dep_walker/win.h +8 -0
- data/lib/dep_walker.rb +164 -0
- data/test/test_dep_walker.rb +22 -0
- metadata +118 -0
data/.autotest
ADDED
data/.gemtest
ADDED
File without changes
|
data/History.rdoc
ADDED
data/Manifest.txt
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
= dep_walker
|
2
|
+
|
3
|
+
* GitHub: http://github.com/bosko/dep_walker
|
4
|
+
* Issues: http://github.com/bosko/dep_walker/issues
|
5
|
+
* Blog: http://pragdevnotes.com
|
6
|
+
|
7
|
+
== DESCRIPTION:
|
8
|
+
|
9
|
+
The dep_walker is small utility gem that checks dependencies for native extensions
|
10
|
+
used by installed gems on Windows. If you are {RubyInstaller}[http://www.rubyinstaller.org]
|
11
|
+
user and have seen message box:
|
12
|
+
|
13
|
+
<em>"This application has failed to start because <name_of_dll>.dll was not found.
|
14
|
+
Re-installing the application may fix this problem"</em>
|
15
|
+
|
16
|
+
when you tried to use gem that has pre-built binariy extension, you've faced common
|
17
|
+
problem on Windows systems - missing dependency dll. Same error might occur even if
|
18
|
+
extension library was built during gem installation if all header files and libraries
|
19
|
+
are available to the build tools, but runtime dependencies are not present.
|
20
|
+
|
21
|
+
With dep_walker you can simply check all installed gems. Even more, if log is turned on,
|
22
|
+
gem will print out information where dependency is found on the system, so you can check
|
23
|
+
whether Ruby extension really uses correct version of required dll.
|
24
|
+
|
25
|
+
== FEATURES/PROBLEMS:
|
26
|
+
|
27
|
+
* None at the moment
|
28
|
+
|
29
|
+
== SYNOPSIS:
|
30
|
+
|
31
|
+
The dep_walker can check all installed gems:
|
32
|
+
|
33
|
+
>dep_walker -a
|
34
|
+
|
35
|
+
or just specific gem
|
36
|
+
|
37
|
+
>dep_walker -c nokogiri-1.4.4
|
38
|
+
|
39
|
+
For verbose output use -t switch
|
40
|
+
|
41
|
+
>dep_walker -c nokogiri-1.4.4 -t
|
42
|
+
|
43
|
+
Finally if you want colored output use --color option. In this case you must
|
44
|
+
have {ANSICON}[http://adoxa.110mb.com/ansicon/index.html] installed.
|
45
|
+
|
46
|
+
For full list of options use
|
47
|
+
|
48
|
+
>dep_walker -h
|
49
|
+
|
50
|
+
== REQUIREMENTS:
|
51
|
+
|
52
|
+
* rake
|
53
|
+
* rubygems
|
54
|
+
* hoe (development)
|
55
|
+
* rake-compiler (development)
|
56
|
+
|
57
|
+
== INSTALL:
|
58
|
+
|
59
|
+
>gem install dep_walker
|
60
|
+
|
61
|
+
== DEVELOPERS:
|
62
|
+
|
63
|
+
* Boško Ivanišević (bosko ivanisevic at gmail com)
|
64
|
+
|
65
|
+
== LICENSE:
|
66
|
+
|
67
|
+
(The MIT License)
|
68
|
+
|
69
|
+
Copyright (c) 2011 Boško Ivanišević
|
70
|
+
|
71
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
72
|
+
a copy of this software and associated documentation files (the
|
73
|
+
'Software'), to deal in the Software without restriction, including
|
74
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
75
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
76
|
+
permit persons to whom the Software is furnished to do so, subject to
|
77
|
+
the following conditions:
|
78
|
+
|
79
|
+
The above copyright notice and this permission notice shall be
|
80
|
+
included in all copies or substantial portions of the Software.
|
81
|
+
|
82
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
83
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
84
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
85
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
86
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
87
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
88
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'hoe'
|
6
|
+
require 'rake/extensiontask'
|
7
|
+
|
8
|
+
Hoe.spec 'dep_walker' do
|
9
|
+
developer('Boško Ivanišević', 'bosko.ivanisevic@gmail.com')
|
10
|
+
self.url = %q{http://github.com/bosko/dep_walker}
|
11
|
+
self.readme_file = 'README.rdoc'
|
12
|
+
self.history_file = 'History.rdoc'
|
13
|
+
self.extra_rdoc_files = FileList['*.rdoc']
|
14
|
+
self.extra_dev_deps << ['rake-compiler', '>= 0']
|
15
|
+
self.spec_extras = { :extensions => ["ext/dep_walker/extconf.rb"] }
|
16
|
+
|
17
|
+
Rake::ExtensionTask.new('dep_walker', spec) do |ext|
|
18
|
+
ext.lib_dir = File.join('lib', 'dep_walker')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Rake::Task[:test].prerequisites << :compile
|
data/bin/dep_walker
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
3
|
+
|
4
|
+
require "ostruct"
|
5
|
+
require "optparse"
|
6
|
+
require "dep_walker"
|
7
|
+
|
8
|
+
def print_result(deps)
|
9
|
+
if deps.empty?
|
10
|
+
print green("All dependencies found")
|
11
|
+
else
|
12
|
+
deps.each do |k,v|
|
13
|
+
print red("Missing dependencies:\n #{k}: ")
|
14
|
+
missing = []
|
15
|
+
v.each do |ext,dll|
|
16
|
+
missing << dll unless missing.include? dll
|
17
|
+
end
|
18
|
+
puts red(missing.join(","))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
$options = OpenStruct.new
|
24
|
+
|
25
|
+
optparse = OptionParser.new do |opts|
|
26
|
+
opts.banner = "Usage: dep_walker [options]"
|
27
|
+
opts.separator ""
|
28
|
+
opts.separator "Options are ..."
|
29
|
+
|
30
|
+
opts.on('-c', '--check [GEM_NAME]', 'Check single gem') do |name|
|
31
|
+
$options.gem_name = name
|
32
|
+
end
|
33
|
+
|
34
|
+
opts.on('-i', '--gem-version [VERSION]', 'Gem version to be checked (optional)') do |version|
|
35
|
+
$options.gem_version = version
|
36
|
+
end
|
37
|
+
|
38
|
+
opts.on('-a', '--all', 'Check all installed gems (overrides -c)') do
|
39
|
+
$options.check_all = true
|
40
|
+
end
|
41
|
+
|
42
|
+
opts.on('-t', '--trace', 'Print messages while checkint is performed') do
|
43
|
+
$options.trace = true
|
44
|
+
end
|
45
|
+
|
46
|
+
opts.on('', '--color', 'Enable color in output') do
|
47
|
+
$options.color = true
|
48
|
+
end
|
49
|
+
|
50
|
+
opts.on('-v', '--version', 'Display program version') do
|
51
|
+
puts "DepWalker version #{DepWalker::VERSION}"
|
52
|
+
exit
|
53
|
+
end
|
54
|
+
|
55
|
+
opts.on('-h', '--help', 'Display this screen') do
|
56
|
+
puts opts
|
57
|
+
exit
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
begin
|
62
|
+
optparse.parse!
|
63
|
+
rescue OptionParser::ParseError => pe
|
64
|
+
puts pe.message
|
65
|
+
puts ''
|
66
|
+
puts optparse
|
67
|
+
exit
|
68
|
+
end
|
69
|
+
|
70
|
+
if $options.check_all
|
71
|
+
print_result(DepWalker.check_all)
|
72
|
+
elsif $options.gem_name
|
73
|
+
print_result(DepWalker.check $options.gem_name, $options.gem_version)
|
74
|
+
else
|
75
|
+
puts optparse
|
76
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#include <ruby.h>
|
2
|
+
#include "win.h"
|
3
|
+
|
4
|
+
static VALUE raw_dependencies(VALUE self, VALUE path)
|
5
|
+
{
|
6
|
+
VALUE mDeps = rb_ary_new();
|
7
|
+
if (RSTRING_LEN(path) > 0)
|
8
|
+
{
|
9
|
+
DumpDllFromPath(mDeps, StringValuePtr(path));
|
10
|
+
}
|
11
|
+
return mDeps;
|
12
|
+
}
|
13
|
+
|
14
|
+
void Init_dep_walker()
|
15
|
+
{
|
16
|
+
VALUE mDepWalker = rb_define_module("DepWalker");
|
17
|
+
rb_define_singleton_method(mDepWalker, "raw_dependencies", raw_dependencies, 1);
|
18
|
+
}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#include <windows.h>
|
2
|
+
#include <imagehlp.h>
|
3
|
+
#include <ruby.h>
|
4
|
+
|
5
|
+
IMAGE_SECTION_HEADER* GetEnclosingSectionHeader(unsigned long rva, IMAGE_NT_HEADERS32* pNTHeader)
|
6
|
+
{
|
7
|
+
IMAGE_SECTION_HEADER* section = IMAGE_FIRST_SECTION(pNTHeader);
|
8
|
+
unsigned int i;
|
9
|
+
|
10
|
+
for (i=0; i < pNTHeader->FileHeader.NumberOfSections; i++, section++)
|
11
|
+
{
|
12
|
+
unsigned long size = section->Misc.VirtualSize;
|
13
|
+
if (0 == size)
|
14
|
+
{
|
15
|
+
size = section->SizeOfRawData;
|
16
|
+
}
|
17
|
+
|
18
|
+
// Is the RVA within this section?
|
19
|
+
if ((rva >= section->VirtualAddress) &&
|
20
|
+
(rva < (section->VirtualAddress + size)))
|
21
|
+
{
|
22
|
+
return section;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
return 0;
|
27
|
+
}
|
28
|
+
|
29
|
+
void* GetPtrFromRVA(unsigned long rva, IMAGE_NT_HEADERS32* pNTHeader, unsigned char* imageBase)
|
30
|
+
{
|
31
|
+
IMAGE_SECTION_HEADER* pSectionHdr;
|
32
|
+
int delta;
|
33
|
+
|
34
|
+
pSectionHdr = GetEnclosingSectionHeader(rva, pNTHeader);
|
35
|
+
if (!pSectionHdr)
|
36
|
+
return 0;
|
37
|
+
|
38
|
+
delta = (int)(pSectionHdr->VirtualAddress-pSectionHdr->PointerToRawData);
|
39
|
+
return (void*)(imageBase + rva - delta);
|
40
|
+
}
|
41
|
+
|
42
|
+
void DumpDllFromPath(VALUE mDeps, char* path)
|
43
|
+
{
|
44
|
+
LOADED_IMAGE* image=ImageLoad(path,0);
|
45
|
+
|
46
|
+
if (NULL != image && image->FileHeader->OptionalHeader.NumberOfRvaAndSizes>=2) {
|
47
|
+
IMAGE_IMPORT_DESCRIPTOR* importDesc=
|
48
|
+
(IMAGE_IMPORT_DESCRIPTOR*)GetPtrFromRVA(
|
49
|
+
image->FileHeader->OptionalHeader.DataDirectory[1].VirtualAddress,
|
50
|
+
image->FileHeader, image->MappedAddress);
|
51
|
+
while (1)
|
52
|
+
{
|
53
|
+
// See if we've reached an empty IMAGE_IMPORT_DESCRIPTOR
|
54
|
+
if ((importDesc->TimeDateStamp==0) && (importDesc->Name==0))
|
55
|
+
break;
|
56
|
+
|
57
|
+
rb_ary_push(mDeps, rb_str_new2((const char*)GetPtrFromRVA(importDesc->Name,
|
58
|
+
image->FileHeader,
|
59
|
+
image->MappedAddress)));
|
60
|
+
importDesc++;
|
61
|
+
}
|
62
|
+
}
|
63
|
+
ImageUnload(image);
|
64
|
+
}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
#ifndef _WIN_H_
|
2
|
+
#define _WIN_H_
|
3
|
+
|
4
|
+
IMAGE_SECTION_HEADER* GetEnclosingSectionHeader(unsigned long rva, IMAGE_NT_HEADERS32* pNTHeader);
|
5
|
+
void* GetPtrFromRVA(unsigned long rva, IMAGE_NT_HEADERS32* pNTHeader, unsigned char* imageBase);
|
6
|
+
void DumpDllFromPath(VALUE mDeps, char* path);
|
7
|
+
|
8
|
+
#endif /* _WIN_H_ */
|
data/lib/dep_walker.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../', __FILE__)
|
2
|
+
require 'rubygems'
|
3
|
+
require "dep_walker/dep_walker"
|
4
|
+
|
5
|
+
##
|
6
|
+
# Set the terminal's foreground color to green if
|
7
|
+
# colored output is set through options
|
8
|
+
##
|
9
|
+
def green(string)
|
10
|
+
if $options.color
|
11
|
+
"\e[1;32m#{string}\e[0m"
|
12
|
+
else
|
13
|
+
string
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Set the terminal's foreground color to red if
|
19
|
+
# colored output is set through options
|
20
|
+
##
|
21
|
+
def red(string)
|
22
|
+
if $options.color
|
23
|
+
"\e[1;31m#{string}\e[0m"
|
24
|
+
else
|
25
|
+
string
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Output message colored according to the message
|
31
|
+
# level (info - no color, success - green, error - red)
|
32
|
+
##
|
33
|
+
def trace(message, level=TRACE_INFO)
|
34
|
+
return unless $options.trace
|
35
|
+
|
36
|
+
case level
|
37
|
+
when DepWalker::TRACE_INFO
|
38
|
+
puts message
|
39
|
+
when DepWalker::TRACE_SUCCESS
|
40
|
+
puts green(message)
|
41
|
+
when DepWalker::TRACE_ERROR
|
42
|
+
puts red(message)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
module DepWalker
|
47
|
+
extend self
|
48
|
+
|
49
|
+
VERSION = '1.0.0'
|
50
|
+
|
51
|
+
##
|
52
|
+
# Informational messages
|
53
|
+
##
|
54
|
+
TRACE_INFO = 0
|
55
|
+
|
56
|
+
##
|
57
|
+
# Succes messages
|
58
|
+
##
|
59
|
+
TRACE_SUCCESS = 1
|
60
|
+
|
61
|
+
##
|
62
|
+
# Error messages
|
63
|
+
#
|
64
|
+
TRACE_ERROR = 2
|
65
|
+
|
66
|
+
##
|
67
|
+
# Checks dependencies for all installed gems. Returns
|
68
|
+
# hash of all unresolved dependencies with the full Gem
|
69
|
+
# name in keys and hash of extension libraries and
|
70
|
+
# dependencies that are not found in the system.
|
71
|
+
##
|
72
|
+
def check_all
|
73
|
+
all_deps = {}
|
74
|
+
Gem::Specification.find_all.each do |spec|
|
75
|
+
gem_deps = check(spec)
|
76
|
+
all_deps[spec.full_name] = gem_deps unless gem_deps.empty?
|
77
|
+
end
|
78
|
+
|
79
|
+
all_deps
|
80
|
+
end
|
81
|
+
|
82
|
+
##
|
83
|
+
# Checks dependencis for a single Gem. Returns hash of extension
|
84
|
+
# library used by Gem as a key and array of unresolved dependencies
|
85
|
+
# as a value.
|
86
|
+
##
|
87
|
+
def check(name_or_spec, version=nil)
|
88
|
+
gem_deps = {}
|
89
|
+
spec = name_or_spec.is_a?(String) ? Gem::Specification.find_all_by_name(name_or_spec, version) : name_or_spec
|
90
|
+
spec.each do |s|
|
91
|
+
walk_deps(s).each do |k,v|
|
92
|
+
gem_deps[k] = v[:not_found] unless v[:not_found].empty?
|
93
|
+
end
|
94
|
+
end
|
95
|
+
gem_deps
|
96
|
+
end
|
97
|
+
|
98
|
+
##
|
99
|
+
# Search dependency dlls for all extension libraries in the Gem.
|
100
|
+
# Search is performed across all directories in the system path
|
101
|
+
# and the extension library's directory. Returns hash with a
|
102
|
+
# full path to extension library as a key and hash with all
|
103
|
+
# dependencies found with the paths from which they will be loade
|
104
|
+
# and all dependencies that are not found.
|
105
|
+
##
|
106
|
+
def walk_deps(gem_spec)
|
107
|
+
dep_tree = {}
|
108
|
+
if gem_spec.is_a? Gem::Specification
|
109
|
+
trace("Checking #{gem_spec.full_name}", TRACE_INFO)
|
110
|
+
dependencies(gem_spec).each do |k,v|
|
111
|
+
trace(" #{k}", TRACE_INFO)
|
112
|
+
found = {}
|
113
|
+
not_found = []
|
114
|
+
v.each do |shlib|
|
115
|
+
if found[shlib].nil? || not_found.include?(shlib)
|
116
|
+
shlib_dir = find_shlib_dir(File.dirname(k), shlib)
|
117
|
+
if shlib_dir
|
118
|
+
found[shlib] = shlib_dir
|
119
|
+
trace(" #{shlib} -> Found at #{shlib_dir}", TRACE_SUCCESS)
|
120
|
+
elsif !shlib.start_with?("msvcrt-ruby")
|
121
|
+
not_found << shlib
|
122
|
+
trace(" #{shlib} -> Not found", TRACE_ERROR)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
dep_tree[k] = {:found => found, :not_found => not_found}
|
127
|
+
end
|
128
|
+
trace("="*40, TRACE_INFO)
|
129
|
+
end
|
130
|
+
dep_tree
|
131
|
+
end
|
132
|
+
|
133
|
+
##
|
134
|
+
# Returns dependencies for all shared libraries found in the
|
135
|
+
# Gem's directories
|
136
|
+
##
|
137
|
+
def dependencies(gem_spec)
|
138
|
+
deps = {}
|
139
|
+
Dir.glob(File.join(gem_spec.full_gem_path, "**/*")).select do |f|
|
140
|
+
f if [".so",".dll"].include? File.extname(f)
|
141
|
+
end.each do |ext|
|
142
|
+
deps[ext] = dll_dependencies(ext)
|
143
|
+
end
|
144
|
+
deps
|
145
|
+
end
|
146
|
+
|
147
|
+
##
|
148
|
+
# Returns all dependencies for input shared library
|
149
|
+
##
|
150
|
+
def dll_dependencies(dll_path = "")
|
151
|
+
return [] unless ['.dll', '.so'].include? File.extname dll_path
|
152
|
+
|
153
|
+
raw_dependencies(dll_path).map {|dep| dep.downcase}.uniq
|
154
|
+
end
|
155
|
+
|
156
|
+
private
|
157
|
+
|
158
|
+
def find_shlib_dir(init_path, shlib)
|
159
|
+
ENV["PATH"].split(File::PATH_SEPARATOR).unshift(init_path).each do |path|
|
160
|
+
return path if File.file?(File.join(path, shlib))
|
161
|
+
end
|
162
|
+
nil
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "dep_walker"
|
3
|
+
|
4
|
+
class TestDepWalker < Test::Unit::TestCase
|
5
|
+
def test_no_argument
|
6
|
+
deps = DepWalker.dll_dependencies
|
7
|
+
assert deps.is_a? Array
|
8
|
+
assert_equal 0, deps.length
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_dep_walker
|
12
|
+
path = File.join(File.expand_path('../../lib/dep_walker', __FILE__), 'dep_walker.so')
|
13
|
+
deps = DepWalker.dll_dependencies path
|
14
|
+
assert_equal 4, deps.length
|
15
|
+
assert deps.include? 'msvcrt.dll'
|
16
|
+
assert deps.include? 'imagehlp.dll'
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_wrong_extension
|
20
|
+
assert_equal 0, DepWalker.dll_dependencies("dummy.txt").length
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dep_walker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Boško Ivanišević
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-05-07 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake-compiler
|
16
|
+
requirement: &22551840 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *22551840
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: hoe
|
27
|
+
requirement: &22548516 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.9.4
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *22548516
|
36
|
+
description: ! 'The dep_walker is small utility gem that checks dependencies for native
|
37
|
+
extensions
|
38
|
+
|
39
|
+
used by installed gems on Windows. If you are {RubyInstaller}[http://www.rubyinstaller.org]
|
40
|
+
|
41
|
+
user and have seen message box:
|
42
|
+
|
43
|
+
|
44
|
+
<em>"This application has failed to start because <name_of_dll>.dll was not found.
|
45
|
+
|
46
|
+
Re-installing the application may fix this problem"</em>
|
47
|
+
|
48
|
+
|
49
|
+
when you tried to use gem that has pre-built binariy extension, you''ve faced common
|
50
|
+
|
51
|
+
problem on Windows systems - missing dependency dll. Same error might occur even
|
52
|
+
if
|
53
|
+
|
54
|
+
extension library was built during gem installation if all header files and libraries
|
55
|
+
|
56
|
+
are available to the build tools, but runtime dependencies are not present.
|
57
|
+
|
58
|
+
|
59
|
+
With dep_walker you can simply check all installed gems. Even more, if log is turned
|
60
|
+
on,
|
61
|
+
|
62
|
+
gem will print out information where dependency is found on the system, so you can
|
63
|
+
check
|
64
|
+
|
65
|
+
whether Ruby extension really uses correct version of required dll.'
|
66
|
+
email:
|
67
|
+
- bosko.ivanisevic@gmail.com
|
68
|
+
executables:
|
69
|
+
- dep_walker
|
70
|
+
extensions:
|
71
|
+
- ext/dep_walker/extconf.rb
|
72
|
+
extra_rdoc_files:
|
73
|
+
- Manifest.txt
|
74
|
+
- History.rdoc
|
75
|
+
- README.rdoc
|
76
|
+
files:
|
77
|
+
- .autotest
|
78
|
+
- History.rdoc
|
79
|
+
- Manifest.txt
|
80
|
+
- README.rdoc
|
81
|
+
- Rakefile
|
82
|
+
- bin/dep_walker
|
83
|
+
- ext/dep_walker/dep_walker.c
|
84
|
+
- ext/dep_walker/extconf.rb
|
85
|
+
- ext/dep_walker/win.c
|
86
|
+
- ext/dep_walker/win.h
|
87
|
+
- lib/dep_walker.rb
|
88
|
+
- test/test_dep_walker.rb
|
89
|
+
- .gemtest
|
90
|
+
homepage: http://github.com/bosko/dep_walker
|
91
|
+
licenses: []
|
92
|
+
post_install_message:
|
93
|
+
rdoc_options:
|
94
|
+
- --main
|
95
|
+
- README.rdoc
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
requirements: []
|
111
|
+
rubyforge_project: dep_walker
|
112
|
+
rubygems_version: 1.8.1
|
113
|
+
signing_key:
|
114
|
+
specification_version: 3
|
115
|
+
summary: The dep_walker is small utility gem that checks dependencies for native extensions
|
116
|
+
used by installed gems on Windows
|
117
|
+
test_files:
|
118
|
+
- test/test_dep_walker.rb
|