ãããã
- ã½ããã¦ã§ã¢ã®ä¸ã®ä¾åé¢ä¿ã«ã¤ãã¦
- æ£è¦è¡¨ç¾ã§æ½åºã§ãããã¨ã¨ãã®éç
- ã³ã¼ãã®ä¾åé¢ä¿ãæ½åºãããã¼ã« rexdep ãä½ãã¾ãã
ã½ããã¦ã§ã¢ã®æ§é ãæ¦è¦³ããã«ã¯
ããªãã¯ã大ããªã½ããã¦ã§ã¢ãç®ã«ããæãä½ããã¾ããï¼ ãã¡ã¤ã«ãä½åãä½ç¾ãããæãã©ãããèªã¿ã¾ããï¼
ã½ããã¦ã§ã¢ã巨大ã«ãªãã¨ããã®ã³ã¼ãã®æ§é ãææ¡ããã®ã¯é£ãããªãã¾ãã ç¹ã«ããã¸ã§ã¯ãã«å ¥ããã¦ã®äººã«ã¨ã£ã¦å·¨å¤§ãªã³ã¼ããã¼ã¹ãä¸ç®ã§ç解ãããã¨ã¯é£ãããç´°ããªã¿ã¹ã¯ãããªãã¦ããä¸ã§å¾ã ã«ãã©ãã«ä½ãæ¸ãã¦ãããããç解ãã¦ããããããã¾ããã ã½ããã¦ã§ã¢ã«ãã£ã¦ã¯ã¢ãã«ã¨ã³ã³ããã¼ã©ããã¼ã¿ãã¼ã¹ã¨ãã¥ã¼ã¨è¨ã£ãå ·åã«ã³ã¼ããåããã¦ããããããããã®åé¡ã¯ãã£ã¬ã¯ããªåãè¦ãã°ç解ã§ããããããã¾ããã ããããã®ãããªãã£ããã¨ããã³ã¼ãã®åé¡ãåãã£ãã¨ããã§ãã½ããã¦ã§ã¢ã®æ§é ãç解ããã¨è¨ããã¨ã¯æãã¾ããã ä¾ãã°ã¢ãã«ã®ä¸ã®ãã¡ã¤ã«ãäºãã«ã©ãããé¢ä¿ã«ãªã£ã¦ããã®ãã¨ãããã¨ã¯ãå®éã«ãã¡ã¤ã«ãèªãã§ã¿ãªãã¨åããã¾ããã
ãªãã¸ã§ã¯ãæåã®ãã©ãã¤ã ãæã¤è¨èªã«ããã¦ãã¯ã©ã¹å³ (ãããã¯ä¸è¬ã«UMLã¢ãã«) ãç¨ããã®ã¯ãã½ããã¦ã§ã¢ãç解ããããã®æå¹ãªæ段ã§ãã ã¯ã©ã¹ã®ç¶æ¿é¢ä¿ãå³ã«ãããã¨ã§ããã®ã½ããã¦ã§ã¢ã«ã©ãããã¯ã©ã¹ããã£ã¦ã©ãããé¢ä¿ãªã®ããä¸ç®ã§è¦ã¦ç解ãããã¨ãã§ãã¾ãã ãã®ããã¸ã§ã¯ãã«æ°ããå ¥ã£ã人ã«ã¨ã£ã¦ããã¯ã©ã¹å³ãæåã«è¦ãã¦ããããã³ã¼ããèªã¿ããããªãã§ãããã è¨è¨æ®µéã§ãããã£ãå³ãç¨ãããã¨ãããã¾ãããæ¢åã®ã³ã¼ãã解ææãã¦ã¯ã©ã¹å³ãçæãã製åãããã¾ãã
ããããç§ãã¡ãç¥ãããã®ã¯ã¯ã©ã¹éã®é¢ä¿ã°ããã§ã¯ããã¾ããã ãªãã¸ã§ã¯ãæåã§ã¯ãªãè¨èªãããããããã¾ãã
ç§ãã¡ã大ããªã½ããã¦ã§ã¢ãåã«ãã¦ç¥ãããã®ã¯ããä½ããã®ãã®ãã®éã®ä¾åé¢ä¿ã§ã¯ãªãã§ããããã
ãä½ããã®ãã®ãã¨ããã®ã¯ãä¾ãã°ãã¡ã¤ã«ã§ãã£ãããããã±ã¼ã¸ã§ãã£ãããã¯ã©ã¹ããªãã¸ã§ã¯ãããããã¯ã¢ã¸ã¥ã¼ã«ã§ãã£ãããã¨ã«ãããããããã®ã§ãã
ä¾ãã°ãCè¨èªã§ããã°ãã¡ã¤ã«ã®éã¯#include
ã¨ãããã¼ã¯ã¼ãã§ãã¡ã¤ã«ãé¢é£ãã¦ãã¾ãã®ã§ããã¡ã¤ã«ã®éã®ä¾åé¢ä¿ãã¯ã©ã¹å³ã®ããã«æç»ã§ãããå¬ããã¨æãã¾ãã
Goã§ããã°package
ã¨ãããã¼ã¯ã¼ãã§ãã®ãã¡ã¤ã«ãæå±ããããã±ã¼ã¸ãè¨è¿°ããimport
ã¨ãããã¼ã¯ã¼ãã§ããã±ã¼ã¸éãé¢é£ãã¾ãã
Haskellã§ããã°ãã¢ã¸ã¥ã¼ã«éã®ä¾åé¢ä¿ãæç»ã§ããããæ½è±¡çãªã³ã¼ããèªã¿å§ããæãããã«ãªãããããã¾ããã
ãã¡ã¤ã«ã§ããããã±ã¼ã¸ã§ããã¢ã¸ã¥ã¼ã«ã§ããããä½ããã®ã¾ã¨ã¾ã£ãã³ã¼ããã®éã®ä¾åé¢ä¿ãç°¡åã«æ½åºã§ãããã大ããªã½ããã¦ã§ã¢ã§ãã£ã¦ãã³ã¼ãã®æ§é ãæ¦è¦³ã§ããã®ã§ã¯ãªãã§ããããã
æ£è¦è¡¨ç¾ã§å¤§éæã«æ½åºããã
ãããã½ããã¦ã§ã¢ã®æ±ç¨çãªä¾åé¢ä¿è§£æãã¼ã«ãä½ãã¾ãããã ããªããªãã©ãããè¨è¨ã«ãã¾ããï¼ Javaã®ã³ã¼ãããã¯ã©ã¹å³ãçæãã製åã®å»¶é·ã§èããã¨ã対å¿ãããè¨èªã®ãã¼ãµã¼ãæè¼ããæå®ãããã³ã¼ãã®è¨èªã«ãã£ã¦ãã¾ããã¨ãã¼ã¹ãã¦ä¾åé¢ä¿ãæãåºãã¨ãããã®ãæãä»ãã§ãããã ãããã次ã®ããã«è¨ããããã©ããã¾ããï¼
ãCãªã#include
ã§ãRubyãªãrequire
ã ããããã¨æè¿ã¯ãµã¼ãã¼ãµã¤ãJavaScriptæµè¡ã£ã¦ããããããJavaScriptã®require
ã«ã対å¿ãã¦ããã¹ããã¢ããªãä½ãããSwiftãããã¨makeããã使ããMakefileã®targetã®ä¾åé¢ä¿ã解æã§ããããã«ãªã£ã¦ãã¨å¬ãããããã¨å人çã«ã¯Haskellã好ããªã®ã§Haskellã«ã対å¿ãã¦ããã¦ããã
ããããè¨èªã«ãã¡ãã¨å¯¾å¿ãã¦ããããããããªãã¨ãè¨ã£ã¦ãããããã®ãã¼ã«ã®ã³ã¼ãã¯æ³¥æ²¼ã«ãªãã§ãããã
è²ã ãªè¨èªã«å¯¾å¿ããã¦ããã¨ãã¾ããã®ã³ã¼ãã¯è¥å¤§åãã¦æã«è² ããªããªãã§ãããã ããã¦ãæ°ãã«æµè¡ã£ã¦ããè¨èªã«å¯¾å¿ããããè¦æ±ãããããã¼ãµã¼ãããªãã®ã«ç¡çã ãâ¦ãã¨ãã¤ããæãããã¾ãã ã¾ããæ½åºããããã®ã¯è¨èªã«ãã£ã¦ä¸ã¤ã§ã¯ããã¾ããã ããè¨èªã§ã¯ã¢ã¸ã¥ã¼ã«ã®ä¾åé¢ä¿ãè¦ããããã¯ã©ã¹ã®ç¶æ¿é¢ä¿ãè¦ããããæã«ã¯é¢æ°ã¬ãã«ã®ä¾åé¢ä¿ãè¦ããã¨ããè¦æ±ãåºã¦ããããããã¾ããã è¨èªãã¨ã«è¨å®ããããã¨ãåºã¦ããã¨ããã¼ã«ã®ãªãã·ã§ã³ãã©ãã©ãå¢ãã¦ããã¾ãã
ãã£ã¨ã·ã³ãã«ã«èãã¾ãããã é£ãããã¨ãããããèãã ãã¨ã夢ã¯è¨ãã¿ã¾ãããã¼ã«ã¯ç¾å®ã«ãªãã¾ããã ããç¨åº¦ã¯æ±ç¨çã«ãããã¤å¦¥åç¹ãè¦ã¤ãã¦ããã以ä¸ã¯é£ããã®ã§ãã®ãã¼ã«ã§ã¯å¯¾å¿ã§ãã¾ãããã¨è¨ããã¨ã«ãã¾ãããã ãã®ãããªæ±ç¨çãã¤ãããã ãªãã¼ã«ã®è¨è¨ã¯ãã©ãããã°ããã®ã§ãããã*1ã
ç§ãã¡ãæ½åºãããã®ã¯ã
#include "test.c"
ã®test.c
ã®é¨åã§ããããããã¯
var bar = require('foo').bar;
ã®foo
ã®é¨åã§ããããããã¯
import Data.Foo
ã®Data.Foo
ã®é¨åã§ãã
ãããããã¡ã¤ã«ãä¾åãã¦ãããã¡ã¤ã«ããããã¯ã¢ã¸ã¥ã¼ã«ãããã£ããæãåºãããããã§ãã
#include
ãrequire
ãimport
ãªã©æ§ã
ããã¾ãããã¨ã«ãã決ã¾ã£ããã¼ã¯ã¼ãã®å¾ã®é¨åãæãåºãããã®ã§ãã
ãããã¯ã©ãããã¦ã¼ã¶ã¼ã«æ£è¦è¡¨ç¾ã1ã¤æå®ãã¦ããã£ãããæãåºãã¾ãããã
ä¾ãã°Cã®ã³ã¼ãã«å¯¾ãã¦ã¯/#include +"(\S+)"/
ã®æ£è¦è¡¨ç¾ã§ãã¡ã¤ã«ããªããã°ããã£ããã£ã¼ããæååãããã®ãã¡ã¤ã«ãèªã¿è¾¼ãã§ãããã¡ã¤ã«ã®ååã«ãªãã¾ãã
ãããã¯/require\('(\S+)'\)/
ãã/import +(\S+)/
ãªã©ã使ãã°ãä»ã®è¨èªã§ã使ããã§ãããã
ãã¡ãããå®ç§ãªæ£è¦è¡¨ç¾ãªã©ããã¾ããã
å
ã»ã©ã®/#include +"(\S+)"/
ã¯ã
// #include "foo.c"
ã®ããã«ã³ã¡ã³ãã¢ã¦ããã¦ã誤ã£ã¦ããããã¦ãã¾ãããã§ãã
ããããããªãæåã«^
ãã¤ãã¦ã/^#include +"(\S+)"/
ã®ããã«ããã°ããã§ãããã
ã§ãCè¨èªã§ã¯#
ã¨include
ã®éã«ç©ºç½æåãç½®ãã¾ããã空ç½æåã¯ã¹ãã¼ã¹ã ãã§ã¯ãªãã¿ãæåãããã¾ãã
# include "foo.c"
ããããããªãã°/^\s*#\s*include\s+"(\S+)"/
ã§ã©ãã§ããããã
ãã®æ£è¦è¡¨ç¾ã§ã¯ãè¡æ«ã«æ¬¡ã®ãããªã³ã¡ã³ããããã¨ã ãã§ããã
#include "foo.c"/*ã³ã¡ã³ã"*/
ã§ã¯/^\s*#\s*include\s+"([^"]+)"/
ã®ããã«ããã¨ã©ãã§ããããã
#include /* ã³ã¡ã³ã */ "foo.c" /* ã³ã¡ã³ã "hoge.c" */
ãããªãã¨ãç°¡åãªæ£è¦è¡¨ç¾ã§å¯¾å¿ã§ãããã«ããã¾ããã ãããã§ãæå°æªãªä¾ã¯ä½ããã®ã§ãã
ããããç§ãã¡ã解æãããã³ã¼ãã¯ãã£ã¨ç¾å®çãªã³ã¼ãã§ãã ä»äºã§æ±ã£ã¦ããããããã¯OSSã®ãããã¨ã¹ã¿ã¤ã«ã®æ´ã£ãã³ã¼ãããã£ã¨å¤§éæã«è§£æãããã®ã§ãã ä¸è¨ã®ãããªç°å¸¸ãªã¹ã¿ã¤ã«ã®ã³ã¼ãã¯ã¾ããªãã®ã§ãã æ¬å½ã«æ£ç¢ºã«è§£æããªãã¦ã¯ãããªãã¨ããè¦æ±ããããªãã°ããã¡ãã¨åããã¼ãµã¼ãç¨æããªãã¦ã¯ããã¾ããããå ç¨è¿°ã¹ãããã«ç¹å®ã®è¨èªã«ç¹åãããã¼ã«ã«ãªã£ã¦ãã¾ããããããã¯å¤ãã®è¨èªã®ãã¼ãµã¼ãæè¼ãå§ãã¦ãã¼ã«ãè¥å¤§åãã¦ãã¾ãã¾ãã ããã§ã¯ãªãã¦ãã£ã¨æ軽ã«ä¾åé¢ä¿ãæãåºãããã®ã§ãã
ã¨ããããã§ãä½ã£ãã®ãrexdepã§ãã
rexdep
å¤ãã®è¨èªã«å©ç¨ã§ããæ±ç¨çãªä¾åé¢ä¿æ½åºãã¼ã« rexdep ãä½æããGitHubã§ã½ã¼ã¹ã³ã¼ããå ¬éãã¦ãã¾ãã
ååã®ç±æ¥ã¯ "Roughly EXtract DEPendency relation"ãããªãã¡ã大éæã«ä¾åé¢ä¿ãæ½åºãããã§ãã 大éæã®æå³ã¯æ¢ã«è¿°ã¹ãã¨ããã§ãã ä¸è¨ã®ãããªè©¦è¡é¯èª¤ãããã¨ããã§å¦¥åç¹ãè¦ã¤ããä¸ã§ããããããã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãããã°å¹ åºãè¦æ±ã«çããããã ããã¨ãã¦ä½ãã¾ããã
ã¤ã³ã¹ãã¼ã«ã¯ã¨ã¦ãç°¡åã§ãã Homebrewãã使ãã®æ¹ã¯ã次ã®ã³ãã³ãã§ããã«ã¤ã³ã¹ãã¼ã«ã§ãã¾ãã
$ brew install itchyny/tap/rexdep
WindowsãDebianãFreeBSDãªã©ãã使ãã®æ¹ã«ã¯ãGitHubã®Releasesãã¼ã¸ã«ã¦ãã¤ããªã¼ãç¨æãã¦ããã¾ãã®ã§ããã¦ã³ãã¼ãããzipãtar.gzã解åãã¦ãã¤ããªã¼ããã¹ã®éã£ããã£ã¬ã¯ããªã«ç§»åãã¦ãã ããã
rexdepã¯æ¬¡ã®ãããªãã¨ãã§ãã¾ãã
- ã¦ã¼ã¶ã¼ãæå®ããæ£è¦è¡¨ç¾ (
--pattern PATTERN
) ããã¡ã¤ã«ã®åè¡ã«ãããããã¦ãããæ£è¦è¡¨ç¾ããã£ããã£ã¼ããæååãä¾åå ã®ãã¡ã¤ã«ãã¢ã¸ã¥ã¼ã«ã¨å¤æãã¾ãã - ãã£ã¬ã¯ããªãæå®ãããæã¯
--recursive
ãªãã·ã§ã³ãã¤ãããã¨ã§ããã£ã¬ã¯ããªä»¥ä¸ã®å ¨ã¦ã®ãã¡ã¤ã«ã解æãã¾ãã - ã¹ãã¼ã¹åºåãããããã¯CSVãdotãJSONã®ãã©ã¼ãããã§åºåã§ãã¾ããç¹ã«dotã®ãã©ã¼ãããã§åºåããdotã³ãã³ãã§ä¾åé¢ä¿ãç»åã«ããã¨ããã®ãæ³å®ãã¦ãã使ãæ¹ã§ãã
dotã¨ããã®ã¯ã°ã©ã (æãç·ã°ã©ãã®ã°ã©ãã§ã¯ãªãããããã¯ã¼ã¯ã¨ãã¦ã®ã°ã©ã) ãè¨è¿°ããããã®è¨èªã®ååã§ããããã¤ãã®è¨èªã§æ¸ãããã¹ã¯ãªãããç»åã«å¤æããã³ãã³ãã®ååã§ãã Graphvizãã¤ã³ã¹ãã¼ã«ãããã¨ããããããã¾ãã
æ¬æ¥ãªãæåã¯ä¸å¯§ã«ä½¿ãæ¹ã説æããã¨ããã§ãããå ã«ãããªãã«å¤§ããªã½ããã¦ã§ã¢ã解æãã¦ã©ã®ãããªãã®ãè¦ããã®ããç´¹ä»ãã¾ãã
ä¾ãã°ãgitã®ã½ã¼ã¹ã³ã¼ããè½ã¨ãã¦ãã¦ãããã¼ã®ä¾åé¢ä¿ãè¦ããã¨ãã¾ãã rexdepã¨dotã³ãã³ããããã°ã次ã®ããã«ç°¡åã«ãããã¼ã®ä¾åé¢ä¿ãæ½åºãããã¨ãã§ãã¾ãã
$ git clone --depth 1 https://github.com/git/git $ rexdep --pattern '^\s*#include\s*[<"](\S+)[>"]' --format dot ./git/*.h | dot -Tpng -o git.png
ã¯ãªãã¯ããã¨å
¨ä½åãè¦ããã¨ãã§ãã¾ããã大ããç»åãªã®ã§ã¢ãã¤ã«ç°å¢ã®æ¹ã¯ã注æãã ããã
ãã¡ã¤ã«éã®ä¾åé¢ä¿ãè¦ãã¨ãã©ã®ãã¡ã¤ã«ãã¦ã¼ãã£ãªãã£ã¼ã£ã½ããã¡ã¤ã«ã§ãã©ã®ãã¡ã¤ã«ãæ©è½ãå®è£
ãã¦ãããã¡ã¤ã«ãã¨ããã®ãè¦ãã¦ãã¾ãã
次ã®ä¾ã¯ãpandocã¨ããHaskell製ã®ææ¸å¤æãã¼ã«ã®ã½ã¼ã¹ã³ã¼ãã解æãããã®ã§ãã
$ git clone --depth 1 https://github.com/jgm/pandoc $ rexdep --pattern '^\s*import +(?:qualified +)?([[:alnum:].]+Pandoc[[:alnum:].]*)' --module '^module +([[:alnum:].]+Pandoc[[:alnum:].]*)' --format dot --recursive ./pandoc/src/ | dot -Tpng -o pandoc.png
ãã¡ãããªã³ã¯å
ã¯å¤§ããªç»åãªã®ã§ã注æãã ããã
ã¢ã¸ã¥ã¼ã«ã®ä¾åé¢ä¿ãæ¦è¦³ã§ããããã«ãªãã¨ãã©ã®ã¢ã¸ã¥ã¼ã«ãéè¦ããããªãã¨ãªãæ´ããã®ã§ãã½ã¼ã¹ã³ã¼ããèªãæãããã«ãªãã¾ãã
ããããã¯ãåºæ¬çãªä½¿ãæ¹ãæããªãããåããããããµã³ãã«ãç¨ãã¦ä½¿ãæ¹ã説æãã¾ãã 次ã®ãããªå°ããªããã¹ããã¡ã¤ã«ãããã¨ãã¾ãã
$ cat test1 import test2 import test3
rexdepã®--pattern
ã«ãimportã®å¾ã®åèªãæãåºããããªæ£è¦è¡¨ç¾ãæå®ãã¦ã¿ã¾ãã
$ rexdep --pattern 'import +(\S+)' test1 test1 test2 test1 test3
å³å´ã¯ä¾åå
ã®ãã¡ã¤ã«ã§ãå·¦å´ã¯ä¾åå
ã«ãªãã¾ãã
--format
ãªãã·ã§ã³ã§åºåã®ãã©ã¼ããããdotè¨èªã«ãã¾ãã
$ rexdep --pattern 'import +(\S+)' --format dot test1 digraph "graph" { "test1" -> "test2"; "test1" -> "test3"; }
ãããdotã³ãã³ãã«ãã¤ããã¤ãªãã ãã§ã次ã®ãããªç»åãå¾ããã¾ãã
$ rexdep --pattern 'import +(\S+)' --format dot test1 | dot -Tpng -o test.png
ãã¡ãããrexdepã«è¤æ°ã®ãã¡ã¤ã«ãæå®ããã¨ããããå ¨ã¦ãèªã¿è¾¼ãã§ä¾åé¢ä¿ãåºåãã¦ããã¾ãã
$ rexdep --pattern 'import +(\S+)' --format dot test{1,2,3,4} digraph "graph" { "test1" -> "test2"; "test1" -> "test3"; "test2" -> "test4"; "test3" -> "test4"; } $ rexdep --pattern 'import +(\S+)' --format dot test{1,2,3,4} | dot -Tpng -o test.png
ãããæãåºæ¬çãªä½¿ãæ¹ã§ãã
rexdepãåãåã£ãæ£è¦è¡¨ç¾ã¯ãå
¨ã¦Goè¨èªã®regexp.Compile
ã§ã³ã³ãã¤ã«ããã¾ãã
Goè¨èªã®æ£è¦è¡¨ç¾ã®ã·ã³ã¿ãã¯ã¹ã¯å
¬å¼ã®ãªãã¡ã¬ã³ã¹ãããã¯go doc regexp/syntax
ãåç
§ãã¦ãã ããã
ããã©ã«ãã§ã¯ãä¾åå ã®ååã¯ãã¡ã¤ã«åã«ãªãã¾ãã ããã¯Cè¨èªã§ã¯ä¾¿å©ã§ãããä»ã®è¨èªã§ã¯ãã¾ã便å©ã§ã¯ãªããã¨ãããã¾ãã ä¾ãã°æ¬¡ã®ãããª2ã¤ã®ãã¡ã¤ã«ãããã¨ãã¾ãã
$ cat Foo.hs module Foo where import Bar import System.Directory $ cat Bar.hs module Bar where import System.IO
--pattern
ã®æå®ã ãã ã¨ã次ã®ããã«ãªãã¾ãã
$ rexdep --pattern 'import (\S+)' Foo.hs Bar.hs Foo.hs Bar Foo.hs System.Directory Bar.hs System.IO
Foo.hs
ã®ä¾åå
ã¯Bar
ã«ãªãã¾ããããä¾åå
ã¯Bar
ã§ã¯ãªããã¡ã¤ã«åã®Bar.hs
ã«ãªã£ã¦ãã¾ã£ã¦ãã¾ãã
ããã§ãrexdepã«ã¯--module
ã¨ãããªãã·ã§ã³ãããã¾ãã
ãã®ã±ã¼ã¹ã ã¨ã次ã®ããã«ããã°ãã¾ãããã¾ãã
$ rexdep --pattern 'import (\S+)' --module 'module (\S+)' Foo.hs Bar.hs Foo Bar Foo System.Directory Bar System.IO
ãã¡ãã¨Foo -> Bar -> System.IO
ã®ãããªé¢ä¿ãã¨ãã¾ããã
ãã®--module
ãªãã·ã§ã³ã¯ããããè¦ã¤ãã¦ããæå¹ã«ãªãã¾ãã
ä¾ãã°ãhogeã¨ããååã§æ¬¡ã®ãããªãã¡ã¤ã«ãããã¨ãã¾ãã
import Bar module Foo import Baa import Baz module Qux import Quux import Quuz
å ã»ã©ã¨åãã³ãã³ãã試ãã¦ã¿ã¾ãã
$ rexdep --pattern 'import (\S+)' --module 'module (\S+)' hoge hoge Bar Foo Baa Foo Baz Qux Quux Qux Quuz
ä¸çªæåã®ä¾åå ã¯ãã¡ã¤ã«åã«ãªã£ã¦ãã¾ããã ã¢ã¸ã¥ã¼ã«ãè¦ã¤ãããããã®ã¢ã¸ã¥ã¼ã«åãä¾åå ã«ãªãã¾ãã ããã¯ããããããã®ã¨ããã¦ãã ããã
ããå°ãé£ãããã¿ã¼ã³ãç´¹ä»ãã¾ãã 次ã®ãããªãã¡ã¤ã«ãããã¨ãã¾ãã
$ cat sample Aã¯Bã¨Cã¨Dã«ä¾åãã¦ãã Bã¯Cã¨Dã«ä¾åãã¦ãã Cã¯Dã«ä¾åãã¦ãã Dã¯ä½ã«ãä¾åãã¦ããªã
ãã®ãµã³ãã«ãã¡ã¤ã«ã«å¯¾ãã¦ã¯ã次ã®ãããªã³ãã³ãã§ä¾åé¢ä¿ãæ½åºã§ãã¾ãã
$ rexdep --pattern '^(?:[A-Z]+)(?:ã¯([A-Z]+))?(?:ã¨([A-Z]+))?(?:ã¨([A-Z]+))?ã«ä¾åãã¦ãã' --module '^([A-Z]+)ã¯.*ä¾åãã¦ãã' sample A B A C A D B C B D C D
ãã®ä¾ã¯æç« ã£ã½ãã®ã§ããã¾ãå¿ç¨ã§ããããã«æããªãããããã¾ããã ããããä¾ãã°æ¬¡ã®ãããªä¾ãèããã¨ãã«ã¯å½¹ç«ã¤ã§ãããã
$ cat Makefile all: clean build build: deps go build install: deps go install deps: go get -d -v . clean: go clean .PHONY: build deps clean $ rexdep --pattern '^[^.][^:]+: +(\S+)(?: +(\S+))?(?: +(\S+))?' --module '^([^.][^:]+):' Makefile all build all clean build deps install deps
è¦äºãMakefileããtargetã®ä¾åé¢ä¿ãæãåºããã¨ãã§ãã¾ããã ã¾ãã次ã®ãããªã¦ã¼ã¹ã±ã¼ã¹ãèãããã¾ãã
$ cat sample.js FooBarApp .service('FooService', [ '$rootScope', '$location', '$window', function(...) { }]) .service('BarService', [ '$location', 'FooService', function(...) { }]) .directive('FooDirective', [ '$location', 'FooService', function(...) { }]) .controller('BarController', [ '$scope', '$location', '$window', 'BarService', function(...) { }]); $ rexdep --pattern "^ *\\.(?:service|directive|controller).*\\[ *'([^']+)'(?:, *'([^']+)')?(?:, *'([^']+)')?(?:, *'([^']+)')?" --module "^ *\\.(?:service|directive|controller)\\('([^']+)'," sample.js FooService $location FooService $rootScope FooService $window BarService $location BarService FooService FooDirective $location FooDirective FooService BarController $location BarController $scope BarController $window BarController BarService
ããããä¾ã ã¨ãã©ããã¦ãæ£è¦è¡¨ç¾ãè¤éã«ãªã£ã¦ãã¾ãã¾ãã æ£è¦è¡¨ç¾ã§è§£æã§ããã¬ãã«ã®éçã¨ããæãããã¾ãã ããããç¹å®ã®è¨èªããã©ãã¤ã ãã¿ã¼ã²ããã«ãã解æãã¼ã«ããããé¥ãã«æè»ã«è¦æ±ã«çãããããã¨ãç解ãã¦ããã ããã¨æãã¾ãã
rexdepã¯ä»¥ä¸ã§ã¯ç´¹ä»ããªãã£ã--start
ã¨--end
ã¨ãããªãã·ã§ã³ãæã£ã¦ãã¾ãã
ãããã®ãªãã·ã§ã³ããã¾ã使ããã¨ã§ãä¾åé¢ä¿ãæ½åºããç¯å²ãå¶å¾¡ããä¾ãã°Goè¨èªã®importããããã±ã¼ã¸ã®ååãæ½åºããããScalaã®ãªãã¸ã§ã¯ãã®ç¶æ¿é¢ä¿ãæ½åºããããããã¨ãã§ãã¾ãã
ããã§ã¯å
·ä½çãªä¾ã¯è¿°ã¹ã¾ããããGitHubã®README.mdãåç
§ããããæãã«ã³ã¼ãããçã£ããã®ãæ½åºã§ããæ£è¦è¡¨ç¾ãè¦ã¤ãã¦ãã ããã
ã¾ã¨ã
ã½ããã¦ã§ã¢ã®ä¸ã®ä¾åé¢ä¿ã大éæã«æ½åºãããã¼ã« rexdep ãä½ãã¾ããã
åºæ¬çã«--pattern
ã®å¼æ°ã¨ããä¸ã¤ã®æ£è¦è¡¨ç¾ã«ãã£ã¦ãå¤ãã®è¨èªã®importæã«å¯¾å¿ãã¦ãã¾ãã
ãã®è¨è¨ã®è£ã«ã¯ããªãã¸ã§ã¯ãæåè¨èªã«ãããã¯ã©ã¹å³ãçæãããããªãASTã¬ãã«ã§è§£æãã¦ãã£ã¡ãã¨ããåºåãè¡ããã¼ã«ã®åå¨ãããã¾ãã ãã®ãããªãã¼ã«ã¯ãç¹å®ã®è¨èªããã©ãã¤ã ã«ç¹åããã¯ã©ã¹ã®ç¶æ¿é¢ä¿ã®ã¿ãªããã¡ã½ããã®åã®ãããªæ·±ã解æããã¦å¤ãã®æ å ±ãè¦ãã¦ããã¾ãã
ä¸æ¹ãç§ã¯ãã¡ãã¨ããåºåããããã¨ã¯è«¦ããã¦ã¼ã¶ã¼ãä¸ã¤æ£è¦è¡¨ç¾ãä¸ãã¦ãããã°ãå¤ãã®è¨èªã§importæã大éæã«æ½åºã§ãããã¨ã«æ°ãã¤ãã¾ããã ããã«ãã£ã¦ãrexdepã¯ãªãã¸ã§ã¯ãæåè¨èªã®ã¿ãªããæ§ã ãªè¨èªã®ãã¡ã¤ã«ãã¢ã¸ã¥ã¼ã«ã®éã®ä¾åé¢ä¿ããã¸ã¥ã¢ã©ã¤ãºãããã¨ãã§ããããã«ãªãã¾ããã æ°ããæµè¡ãã ããè¨èªããã¤ãã¼ãªè¨èªã§ããæ£è¦è¡¨ç¾ãä¸ã¤ä¸ãããããã°ãã½ããã¦ã§ã¢ã®æ§é ãæ¦è¦³ã§ããã¨æãã¾ãã
rexdepã¯å¤§éæã§ãã ãããããªã³ã¡ã³ããã絶対ã«æ£è¦è¡¨ç¾ã§ã¯å¯¾å¿ã§ããªããããªãã¿ã¼ã³ã¯ãããã§ãåå¨ãã¾ãã
ããããã½ããã¦ã§ã¢ã®æ§é ã大éæã«æ¦è¦³ããç´ æ©ããã¸ã¥ã¢ã©ã¤ãºãããã¨ããè¦æ±ã®ãã¨ã§ã¯ãrexdepã®ã¢ããã¼ãã¯ä¸ã¤ã®æå¹ãªæ段ã ã¨èãã¦ãã¾ãã ã½ããã¦ã§ã¢ã®æ§é ãæ¦è¦³ã§ããããã«ãªãã¨ãæ°ãããã¼ã ã«å ¥ã£ã人ã«ç解ãã¦ãããããããªãã°ããã§ã¯ãªããä¾åé¢ä¿ãããã¹ãã§ãªãç®æãè¦ã¤ãã£ããããªãã¡ã¯ã¿ãªã³ã°ã®æéã«ä½¿ããã¨èãã¦ãã¾ãã
ãæ£è¦è¡¨ç¾ã§ã³ã¼ããªããããããç¨åº¦ãªãã³ã¼ããæ¦è¦³ã§ãããªããã¨ããã¢ã¤ãã£ã¢ã¯ãä¸å¹´ä»¥ä¸åããç§ã®ä¸ã«ããã¾ããã æåã¯mikutterã®ã³ã¼ããèªã¿ããã¨æã£ããã®ã®ãRubyã¯å ¨ãã®åå¿è ãªã®ã§ãããã¦ã³ã¼ãã®ä¾åé¢ä¿ã§ãã¨æã£ã¦æç»ãã¦ã¿ãã®ãå§ã¾ãã§ããã å½æã¯zshã§ã¹ã¯ãªãããæ¸ãã¾ãããã使ãæ¨ã¦ã®ã¹ã¯ãªããã§æ±ç¨çã«ããæ°ã¯ããã¾ããã§ããã ããããä»äºã«å°±ã大ããªã½ããã¦ã§ã¢ãç®ã«ããã¨ãã½ããã¦ã§ã¢ã®æ§é ããã£ããææ¡ããå¿ è¦æ§ãæãå§ãã¾ããã ã¾ããä»ã®ã¨ã³ã¸ãã¢ã®æ¹ãPerlã®ã³ã¼ããéç解æãã¦ä½ã£ãã¯ã©ã¹å³ãå ã«ãªãã¡ã¯ã¿ãªã³ã°ãã¦ããã®ãèãã¦ãæãã£ãã¢ã¤ãã£ã¢ãããæãã«çµã¿ç«ã¦ãªããã¦å½¢ã«ãããã¨èãã¾ããã è²ã ã¨è©¦è¡é¯èª¤ãããzshã®ã¹ã¯ãªããã§mockãä½ããªããããããèããæ«ãæçµçã«æ£è¦è¡¨ç¾ãå¼æ°ã§ãããä»ã®å½¢ã®rexdepã«åã¾ã£ãã¨ããããã§ãã ã¾ããä»äºã§Goã触ãå§ããã®ã¨ãå人çã«Goã§ä¸ã¤ã¾ã¨ã¾ã£ãcliãã¼ã«ãä½ãããã£ãã¨ãããã¨ããã«ããã©ãããã©ã¼ã åãã«ãã¤ããªã¼ã§é å¸ãããã£ãã®ã§ãGoã§å®è£ ãã¾ããã
æ£è¦è¡¨ç¾ã§ä¾åé¢ä¿ã大éæã«æ½åºããã ãã®ã·ã³ãã«ãªã¢ã¤ãã£ã¢ããçã¾ããrexdepãããã²ã使ãä¸ããã
ã¯ã¦ãªã§ã¯ãã¼ãããã¨ããã¢ã¤ãã£ã¢ãã³ã¼ãã«ã§ãã¦ãè¦æ±ãæ£ç¢ºã«åæããä¸ã§å®ç¾å¯è½ã§ãã¤ç ´ç¶»ãã«ããè¨è¨ãã§ããã¾ãä½ã£ããã®ãå ¬éãä¸ã«åºãã¦ãå¤ãã®äººã«ä½¿ã£ã¦ãããããããããªæ欲çã§ãã¤è½åçãªã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã hatenacorp.jp
*1:ããããææ³ã¯ãæä½ã®lightline.vimã¨éãããã®ãããã¾ããä»ã®ãã©ã°ã¤ã³ã®é¢æ°ã使ã£ã¦ãã¾ãã¨ãæ°ããæµè¡ã£ããã©ã°ã¤ã³ã«ã対å¿ããªãã¦ã¯ããã¾ãããlightline.vimã¯ãä»ã®ãã©ã°ã¤ã³ã¨ã®é£æºã¯ã¦ã¼ã¶ã¼ã«å§ãã¦ãã¾ããããæãã«ä»ã®ãã©ã°ã¤ã³ã¨ã¤ã³ãã°ã¬ã¼ã·ã§ã³ãã¦ä¸äººã«ä¾¿å©ã«ãªããã¨ã諦ããã®ã§ãããããããã¨ã«ãã£ã¦ãlightline.vimèªä½ã®è²¬åãæå°éã«ãã¦ã³ã¼ããè¥å¤§åããã®ãåé¿ãããã¤ã¦ã¼ã¶ã¼ã使ãã¤ã³ã¿ã¼ãã§ã¼ã¹ãæ±ç¨çã«ãã¦ãã¯ã¼ã¦ã¼ã¶ã¼ã®è¦æ±ã«ãå¿ããã®ã§ãã詳ããã¯lightline.vimä½ãã¾ãã - ãã©ã°ã¤ã³ã®ç´äº¤æ§ã«ã¤ãã¦ããåç §ãã ããã