2014-03-30 3 views
3

Я пишу макрос, который должен открыть каталог, который находится в той же папке, что и мой класс макросов. Проблема в том, что мне нужно иметь возможность делать то же самое, без необходимости знать о папке макроса.Haxe macro - открыть файл с относительным путем

Мой вопрос прост, есть ли способ открыть FileSystem в макросе в текущем каталоге.

например: (Ь (Macro.hx, с (...)))

мне нужно открыть "с" непосредственно, когда я бегу макро методы от "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

Спасибо, это было именно то, что мне нужно. Я уже пробовал resolvePath без успеха, потому что я пытался с my.package.MyMacroData.json, а не с '/' .... Я глуп ^^ «Спасибо :) – Peekmo

Смежные вопросы