用 Ruby 查找 workspace 里 project 的依赖关系

  用 VC 6 做开发,项目一大起来,workspace 里 project 间的依赖关系就比较复杂,尤其是历史比较长,上手的人比较多的项目,之前用 PHP 实现了一个查找 VC 6 项目依赖关系的程序,但是总感觉别人用起来准备环境不太方便,于是假期里用 Ruby 重新实现了一遍。

  1. if ARGV.length <= 0
  2.      print 'Please enter filename of DSW: '
  3.      dsw = Kernel.gets.rstrip
  4.  elsif ARGV.length >= 1
  5.      if '-h' == ARGV[0] || 'help' == ARGV[0] || '--help' == ARGV[0]
  6.          puts 'Usage: ruby ' + $0 + ' dsw_filename'
  7.          exit
  8.      else
  9.          dsw = ARGV[0]
  10.      end
  11.  end
  12.  
  13.  rePath     = Regexp.new( '(.*(?:/|\\\\)).*' )
  14.  reProject  = Regexp.new( 'Project: "([^"]*)"="?([^"]*)"? - ' )
  15.  reTargType = Regexp.new( '# TARGTYPE ".*" 0x(\d+)' )
  16.  reConfig   = Regexp.new( '"\$\(CFG\)" == "[^"]* - Win32 ([^"]*)"' )
  17.  reOut      = Regexp.new( '/out:"[^"]*(?:/|\\\\)([^"]*\.[^"]*)"' )
  18.  reLink     = Regexp.new( '# ADD LINK32 ([^/]*)' )
  19.  
  20.  mdPath = rePath.match( dsw )
  21.  if nil != mdPath
  22.      basePath = mdPath[1]
  23.  end
  24.  
  25.  projects = Hash.new
  26.  
  27.  if !File.readable_real?( dsw )
  28.      puts "Can't open file - " + dsw
  29.      exit
  30.  end
  31.  
  32.  fileDsw = open( dsw, 'r' )
  33.  fileDsw.each_line{ |line|
  34.      mdProject = reProject.match( line )
  35.      if nil != mdProject
  36.          projectName = mdProject[1]
  37.          projects[projectName] = Hash.new
  38.          projects[projectName]['dsp']         = mdProject[2]
  39.          projects[projectName]['linkRelease'] = ''
  40.          projects[projectName]['linkDebug']   = ''
  41.  
  42.          config = ''
  43.          fileDsp = open( basePath + mdProject[2], "r" )
  44.          fileDsp.each_line{ |line|
  45.              mdTargType = reTargType.match( line )
  46.              if nil != mdTargType
  47.                  case mdTargType[1]
  48.                  when '0101'
  49.                      projects[projectName]['extName'] = '.exe'  # Win32 (x86) Application
  50.                  when '0102'
  51.                      projects[projectName]['extName'] = '.dll'  # Win32 (x86) Dynamic-Link Library
  52.                  when '0103'
  53.                      projects[projectName]['extName'] = '.exe'  # Win32 (x86) Console Application
  54.                  when '0104'
  55.                      projects[projectName]['extName'] = '.lib'  # Win32 (x86) Static Library
  56.                  else
  57.                      puts mdTargType
  58.                  end
  59.                  projects[projectName]['outRelease'] = projectName.downcase + projects[projectName]['extName']
  60.                  projects[projectName]['outDebug']   = projects[projectName]['outRelease']
  61.                  next
  62.              end
  63.  
  64.              mdConfig = reConfig.match( line )
  65.              if nil != mdConfig
  66.                  config = mdConfig[1]
  67.                  next
  68.              end
  69.  
  70.              mdOut = reOut.match( line )
  71.              if nil != mdOut
  72.                  if 'Release' == config
  73.                      projects[projectName]['outRelease'] = mdOut[1].downcase
  74.                  else
  75.                      projects[projectName]['outDebug']   = mdOut[1].downcase
  76.                  end
  77.                  # next  # Can't call next here
  78.              end
  79.  
  80.              mdLink = reLink.match( line )
  81.              if nil != mdLink
  82.                  if 'Release' == config
  83.                      projects[projectName]['linkRelease'] = mdLink[1].downcase
  84.                  else
  85.                      projects[projectName]['linkDebug']   = mdLink[1].downcase
  86.                  end
  87.                  next
  88.              end
  89.          }
  90.          fileDsp.close()
  91.      end
  92.  }
  93.  fileDsw.close()
  94.  
  95.  projects.each{ |key, value|
  96.      if '.lib' == value['extName']
  97.          next
  98.      end
  99.  
  100.      out = ''
  101.      projects.each{ |key2, value2|
  102.          if value['linkDebug'].include?( value2['outDebug'] )
  103.              out += ( '    ' + key2 + ' - ' + value2['outDebug'] + "\n" )
  104.          end
  105.      }
  106.  
  107.      if !out.empty?
  108.          puts 'Project: ' + key + ' - ' + value['outDebug']
  109.          puts out
  110.      end
  111.  }

  核心的部分用正则表达式实现,现在总觉得越是在实用中尝试使用正则表达式就越能感受到它的强大!

2 Responses to “用 Ruby 查找 workspace 里 project 的依赖关系”

  1. dove1980 Says:

    学习这么多语言,我现在就想学习一种
    ^_^

  2. 2ndboy Says:

    精有静的好处,广有广的好处,最好的是在广的基础上专精一两门,任何事情都不是绝对的 :)

Leave a Reply