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

  有了之前写的那个 Ruby 程序,早前用 PHP 实现的版本就算作古啦,放在这里分享一下:

  1.  $dsw = 'C:/test/test.dsw'// Modify the content before running
  2.  $data = file_get_contents( $dsw );
  3.  
  4.  preg_match( '{(.*(?:/|\\\\)).*}', $dsw, $match );
  5.  $basePath = $match[1];
  6.  
  7.  preg_match_all( '{Project: "([^"]*)"="?([^"]*)"? - }', $data, $matches );
  8.  
  9.  $projects = array();
  10.  for( $i = 0; $i < count( $matches[1] ); $i++ )
  11.  {
  12.      $projectname = $matches[1][$i];
  13.      $projects[$projectname] = array();
  14.      $projects[$projectname]['dsp'] = $matches[2][$i];
  15.  
  16.      $data = file_get_contents( $basePath . $projects[$projectname]['dsp'] );
  17.  
  18.      // Get project type
  19.      preg_match( '{# TARGTYPE ".*" 0x(\d+)}', $data, $match );
  20.      switch( $match[1] )
  21.      {
  22.          case '0101': $projects[$projectname]['extName'] = '.exe'; break// Win32 (x86) Application
  23.          case '0102': $projects[$projectname]['extName'] = '.dll'; break// Win32 (x86) Dynamic-Link Library
  24.          case '0103': $projects[$projectname]['extName'] = '.exe'; break// Win32 (x86) Console Application
  25.          case '0104': $projects[$projectname]['extName'] = '.lib'; break// Win32 (x86) Static Library
  26.          default: print_r( $match );
  27.      }
  28.  
  29.      // Get output filename
  30.      $result = preg_match_all( '{/out:"[^"]*(?:/|\\\\)([^"]*\.[^"]*)"}', $data, $matches2 );
  31.      if( $result >= 2 )
  32.      {
  33.          $projects[$projectname]['outDebug']   = strtolower( $matches2[1][0] );
  34.          $projects[$projectname]['outRelease'] = strtolower( $matches2[1][1] );
  35.      }
  36.      else if( 1 == $result )
  37.      {
  38.          $projects[$projectname]['outDebug']   = strtolower( $matches2[1][0] );
  39.          $projects[$projectname]['outRelease'] = strtolower( $matches2[1][0] );
  40.      }
  41.      else  // 0
  42.      {
  43.          $projects[$projectname]['outDebug']   = strtolower( $projectname . $projects[$projectname]['extName'] );
  44.          $projects[$projectname]['outRelease'] = strtolower( $projectname . $projects[$projectname]['extName'] );
  45.      }
  46.  
  47.      // Get all libs
  48.      $result = preg_match_all( '{# ADD LINK32 ([^/]*)}', $data, $matches2 );
  49.      if( $result >= 2 )
  50.      {
  51.          $projects[$projectname]['linkDebug']   = strtolower( $matches2[1][0] );
  52.          $projects[$projectname]['linkRelease'] = strtolower( $matches2[1][1] );
  53.      }
  54.      else if( 1 == $result )
  55.      {
  56.          $projects[$projectname]['linkDebug']   = strtolower( $matches2[1][0] );
  57.          $projects[$projectname]['linkRelease'] = strtolower( $matches2[1][0] );
  58.      }
  59.      else  // 0
  60.      {
  61.          $projects[$projectname]['linkDebug']   = '';
  62.          $projects[$projectname]['linkRelease'] = '';
  63.      }
  64.  }
  65.  
  66.  foreach( $projects as $key => $value )
  67.  {
  68.      if( '.lib' == $value['extName'] )
  69.          continue;
  70.  
  71.      echo '<br/>Project: ' . $key . '<br/>';
  72.      foreach( $projects as $key2 => $value2 )
  73.      {
  74.          if( strstr( $value['linkDebug'], $value2['outDebug'] ) )
  75.              echo $key2 . '<br/>';
  76.      }
  77.  }
  78.  ?>

  今天早上尝试了一把 RubyScript2Exe,很好很强大!就一个 .rb 文件,用它把需要转成 EXE 的 Ruby 脚本跑一遍就可以生成一个可以完全脱离 Ruby 环境单独运行的可执行程序。把之前写的那个 Ruby 程序转换了一下,现在完全可以实用啦!

Leave a Reply