ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Expanded $: für require
BeitragVerfasst: 29 Nov 2009, 22:05 
Offline
Son-shi

Registriert: 23 Feb 2004, 14:59
Beiträge: 941
Wohnort: Esslingen
Hallo,
Zur Zeit bin ich etwas mit gems und Ladepfaden am experimentieren (siehe meine Frage Neues Gem anlegen/Pfadstruktur in Gems) und habe beim reorganisieren der Pfade jetzt teilweise ein Kuddelmuddel (ist einfach doof, wenn man eine lokale Entwicklungskopie anlegt und Ruby dann doch lieber beschließt eine alte Gem-Version zu verwenden).

Und irgendwie bekam ich nicht heraus, was require wirklich lädt.

Anbei eine Anpassung, die require so modifiziert, dass die Variable $MY_LOADED_FEATURES analog $: alle geladenen Pakete enthält, aber diesmal mit dem kompletten Pfadnamen.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#
#Redefine require to get a list with all expanded filenames of the required features.
#
#

#An 'expanded $"'.
#All loaded features, but with the complete path.
$MY_LOADED_FEATURES = [] #expanded ":

alias :old_require :require
#Redefine require, to get an 'expanded $"' ($MY_LOADED_FEATURES)
#All loaded features, but with the complete path.
#
#If there is a name conflict between load files, you get a warning.
def require( package )
#make the original require and return if there was a failure.
return false unless old_require package
loaded = $".last #get the filename of the last load
found = [] #help variable to collect possible file pathes.
$:.each{|searchpath| #loop on search pathes
#Check if the last load is found in the search path
found << "#{searchpath}/#{loaded}" if File.exist?( "#{searchpath}/#{loaded}")
}

#Store the path of the loaded feature
$MY_LOADED_FEATURES << found.first
case found.size
when 0 #May not happen.
puts "require: loaded #{loaded}, but don't know from where"
when 1 #Everything ok.
else
puts "Filename conflict in require: #{loaded}: #{found.inspect}"
#~ STDERR << "Filename conflict in require: #{loaded}: #{found.inspect}\n"
end #found.size

true #return result of old_require
end


Das Testprogramm

1
2
require 'log4r'
puts $MY_LOADED_FEATURES
ergibt so bei mir
Zitat:
Filename conflict in require: singleton.rb: ["C:/Program Files/ruby/lib/ruby/1.8/singleton.rb", "./singleton.rb"]
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/config.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/base.rb
C:/Program Files/ruby/lib/ruby/1.8/singleton.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/repository.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/logevent.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/loggerfactory.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/staticlogger.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/logger.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/outputter/outputterfactory.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/formatter/formatter.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/outputter/outputter.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/outputter/iooutputter.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/outputter/fileoutputter.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/outputter/consoleoutputters.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/outputter/staticoutputter.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/outputter/rollingfileoutputter.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r/formatter/patternformatter.rb
C:/Program Files/ruby/lib/ruby/gems/1.8/gems/log4r-1.0.5/src/log4r.rb


Die Konfliktmeldung habe ich provoziert, indem ich eine (leere) singleton.rb im gleichen Ordner wie meine Testdatei abgelegt habe.

Anbei eine zip-Datei
Dateianhang:
myrequire.zip [1.42 KiB]
114-mal heruntergeladen
mit dem Code, das Testprogramm und die (leere) singleton.rb zum selbst ausprobieren.

Mir hat es geholfen, ich konnte so relativ leicht identifizieren, welche Datei wirklich geladen wird (Ruby 1.8.6). Das Code-Stück geht implizit davon aus, das $: immer das gerade zuletzt geladene Feature auch ans Ende packt. Keine Ahnung ob es in 1.9 auch noch so ist.

_________________
http://ruby.lickert.net/
http://gems.rubypla.net/


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: