2014-03-30 4 views
3

매크로 클래스와 같은 폴더에있는 디렉토리를 열어야하는 매크로를 작성하고 있습니다. 문제는 매크로의 폴더를 의식 할 필요없이 똑같은 일을 할 수 있어야한다는 것입니다.Haxe 매크로 - 상대 경로로 파일 열기

내 질문은 간단합니다, 현재 디렉토리에서 매크로로 FileSystem을 여는 방법이 있습니까?

예 : A (B (Macro.hx, C (...))) 나는 "C"직접 내가 "Macro.hx"에서 매크로 방법을 실행 해요

를 열 필요가

당신은 아이디어가있는 경우

감사합니다 :)

답변

6

매크로의 내부 같은 기능을 사용할 수 있습니다 :

static function loadFileAsString(path:String) { 
     try { 
      var p = haxe.macro.Context.resolvePath(path); 
      return sys.io.File.getContent(p); 
     } 
     catch(e:Dynamic) { 
      return haxe.macro.Context.error('Failed to load file $path: $e', Context.currentPos()); 
     } 
    } 

기본적으로, Context.resolvePath는 상대 경로를 해결합니다 모든 학급 경로에. 매크로 파일 my/package/MyMacro.hx에, 당신은 my/package/MyMacroData.json를로드하려는 경우, 당신은 사용할 수 있습니다

haxe.macro.Context.resolvePath('my/package/MyMacroData.json'); 

이 빌드의 모든 클래스 경로를 확인합니다 - 어떤 haxelibs 등을 포함하여, 그래서 파일을 찾을 수 있지만, 동일한 패키지/위치에 있지만 다른 클래스 경로 또는 haxelib에 파일을 저장함으로써 "섀도우"할 수 있으므로 고유 패키지/이름을 사용하여 우연히 발생하지 않도록하십시오.

하지만 예제 구현을보고 싶다면 내 compiletime library에서 사용하면됩니다. 관련 코드로 함수에 링크했습니다.

+0

감사합니다. 정확히 내가 필요한 것입니다. 나는 이미 my.package.MyMacroData.json으로 시도하고 있었기 때문에 resolvePath를 성공하지 못했습니다. '/'....로하지 않았습니다. 저는 바보입니다 ^^ "고맙습니다. :) – Peekmo

관련 문제