差沙的密碼 -- SSHWSFC's code
          閱讀本Blog請自備塑料袋一只
          posts - 14,  comments - 59,  trackbacks - 0

          為了記錄自己看Rails源碼的過程,全程記錄無廢話。

          我們看看script/server都干了什么

          require?File.dirname(__FILE__)? + ? ' /../config/boot '
          require?
          ' commands/server '

          引用了boot.rb這個文件。看來這個文件是rails啟動的入口,來看看怎么回事吧。
          unless?defined?(RAILS_ROOT)
          ??root_path?
          =?File.join(File.dirname(__FILE__),?'..')

          ??unless?RUBY_PLATFORM?
          =~?/mswin32/
          ????require?
          'pathname'
          ????root_path?
          =?Pathname.new(root_path).cleanpath(true).to_s
          ??end

          ??RAILS_ROOT?
          =?root_path
          end
          這一部分定義了RAILS_ROOT這個系統的全局變量,指定了項目的根目錄,大家可以在以后華麗的使用了。

          下一部分是找到rails,粗略看一下。
          ??if?File.directory?("#{RAILS_ROOT}/vendor/rails")
          ????require?
          "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
          ??
          else
          ????require?
          'rubygems'
          這里能看到,他先跑到vendor/rails去找rails了,這就是我們為什么能在插件里用rails是原因。如果沒有那么gems的干活。
          接下來是初始化一下load_path,沒什么看的了。boot.rb就這樣的吧。

          回到script/server的第二行,包含了'commands/server'這個文件,這個文件是什么?Rails的源碼里面找吧。我們在Rails的源碼里面找到這個文件。
          require?'active_support'
          require?
          'fileutils'

          begin
          ??require_library_or_gem?
          'fcgi'
          rescue?Exception
          ??
          #?FCGI?not?available
          end

          server?
          =?case?ARGV.first
          ??when?
          "lighttpd"
          ????ARGV.shift
          ??when?
          "webrick"
          ????ARGV.shift
          ??
          else
          ????
          if?RUBY_PLATFORM?!~?/mswin/?&&?!silence_stderr?{?`lighttpd?-version`?}.blank??&&?defined?(FCGI)
          ??????
          "lighttpd"
          ????
          else
          ??????
          "webrick"
          ????end
          end

          if?server?==?"webrick"
          ??puts?
          "=>?Booting?WEBrick"
          else
          ??puts?
          "=>?Booting?lighttpd?(use?'script/server?webrick'?to?force?WEBrick)"
          end

          FileUtils.mkdir_p(
          %w(?tmp/sessions?tmp/cache?tmp/sockets?))
          require?
          "commands/servers/#{server}"
          沒想到ActiveRecord居然是在這里引用的,這個ActiveRecord里面擴展了很對Ruby的既有類型,所以我們看源碼的時候如果發現有不熟悉的方法,就來這里找找,當然,看Rails的API是最好的選擇。

          從參數一目了然,我們可以傳入server的名字,lighttpd和webrick,根據不同的server選擇不同的server文件來讀取。我們還是看看webrick的吧。

          require?'webrick'
          require?
          'optparse'

          OPTIONS?
          =?{
          ??:port????????????
          =>?3000,
          ??:ip??????????????
          =>?"0.0.0.0",
          ??:environment?????
          =>?(ENV['RAILS_ENV']?||?"development").dup,
          ??:server_root?????
          =>?File.expand_path(RAILS_ROOT?+?"/public/"),
          ??:server_type?????
          =>?WEBrick::SimpleServer,
          ??:charset?????????
          =>?"UTF-8",
          ??:mime_types??????
          =>?WEBrick::HTTPUtils::DefaultMimeTypes
          }

          ARGV.options?do?
          |opts|
          ??script_name?
          =?File.basename($0)
          ??opts.banner?
          =?"Usage:?ruby?#{script_name}?[options]"

          ??opts.separator?
          ""

          ??opts.on(
          "-p",?"--port=port",?Integer,
          ??????????
          "Runs?Rails?on?the?specified?port.",
          ??????????
          "Default:?3000")?{?|v|?OPTIONS[:port]?=?v?}
          ??opts.on(
          "-b",?"--binding=ip",?String,
          ??????????
          "Binds?Rails?to?the?specified?ip.",
          ??????????
          "Default:?0.0.0.0")?{?|v|?OPTIONS[:ip]?=?v?}
          ??opts.on(
          "-e",?"--environment=name",?String,
          ??????????
          "Specifies?the?environment?to?run?this?server?under?(test/development/production).",
          ??????????
          "Default:?development")?{?|v|?OPTIONS[:environment]?=?v?}
          ??opts.on(
          "-m",?"--mime-types=filename",?String,
          ??????????????????
          "Specifies?an?Apache?style?mime.types?configuration?file?to?be?used?for?mime?types",
          ??????????????????
          "Default:?none")?{?|mime_types_file|?OPTIONS[:mime_types]?=?WEBrick::HTTPUtils::load_mime_types(mime_types_file)?}

          ??opts.on(
          "-d",?"--daemon",
          ??????????
          "Make?Rails?run?as?a?Daemon?(only?works?if?fork?is?available?--?meaning?on?*nix)."
          ??????????)?{?OPTIONS[:server_type]?
          =?WEBrick::Daemon?}

          ??opts.on(
          "-c",?"--charset=charset",?String,
          ??????????
          "Set?default?charset?for?output.",
          ??????????
          "Default:?UTF-8")?{?|v|?OPTIONS[:charset]?=?v?}

          ??opts.separator?
          ""

          ??opts.on(
          "-h",?"--help",
          ??????????
          "Show?this?help?message.")?{?puts?opts;?exit?}

          ??opts.parse!
          end

          ENV[
          "RAILS_ENV"]?=?OPTIONS[:environment]
          RAILS_ENV.replace(OPTIONS[:environment])?
          if?defined?(RAILS_ENV)

          require?RAILS_ROOT?
          +?"/config/environment"
          require?
          'webrick_server'

          OPTIONS[
          'working_directory']?=?File.expand_path(RAILS_ROOT)

          puts?
          "=>?Rails?application?started?on?http://#{OPTIONS[:ip]}:#{OPTIONS[:port]}"
          puts?
          "=>?Ctrl-C?to?shutdown?server;?call?with?--help?for?options"?if?OPTIONS[:server_type]?==?WEBrick::SimpleServer
          DispatchServlet.dispatch(OPTIONS)
          本來不想把大段的代碼貼上來,但是這里面的內容可能大家都比較關心,涉及到server的啟動參數。
          ??:port????????????=>?端口,
          ??:ip??????????????
          =>?server ip,
          ??:environment?????
          =>運行環境,
          ??:server_root?????
          =>?web訪問的目錄,(很多人問這個怎么改)
          ??:server_type?????
          =>?WEBrick::SimpleServer,
          ??:charset?????????
          =>?"UTF-8", 編碼
          ??:mime_types??????
          =>?WEBrick::HTTPUtils::DefaultMimeTypes

          后面的require?引入了兩個文件,一個是'webrick_server',別看,就是他。另外一個是config/environment,這個文件是系統的全局配置文件,很重要,我們還是下次看看這個文件去吧。里面還真挺有意思。

          (不知道blogjava讓不讓寫ROR的文章,看到有人寫了所以放在首頁了,如果不妥,我會盡快刪除)
          posted on 2006-11-20 23:43 差沙 閱讀(4573) 評論(0)  編輯  收藏 所屬分類: ROR

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          這家伙很懶,但起碼還是寫了一句話。

          <2006年11月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(8)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 隆子县| 行唐县| 万盛区| 琼结县| 永嘉县| 四子王旗| 保山市| 千阳县| 安塞县| 大新县| 湘乡市| 龙井市| 厦门市| 盘锦市| 昌都县| 米易县| 宁安市| 宁强县| 牡丹江市| 柯坪县| 北海市| 体育| 明水县| 泾阳县| 肇东市| 开平市| 巩留县| 涞水县| 内黄县| 桑日县| 浪卡子县| 玉龙| 新巴尔虎右旗| 长顺县| 鲁甸县| 河池市| 电白县| 泰顺县| 彰化县| 刚察县| 临武县|