2013-05-20 3 views
2

Я пытаюсь создать проект, который использует tsc (компилятор TypeScript) в Windows, и кажется, что когда SCons вызывает компилятор, он вызывает его в неправильном каталоге. Кроме того, команда она генерирует, несмотря на все мои усилия, использует относительные пути вместо абсолютных, и не ниже код, который делает это:Как заставить SCons использовать абсолютный путь вместо относительного по целям?

import os 

sdk_sources = [] # some *.ts files 

deployments_settings = [] # some more files 

def prefix_file(file): 
    return os.path.join(Dir('.').abspath, 'src', str(file)) 

def modify_targets(target, source, env): 
    for x in source: 
     print "source: %s" % str(x) 
    return target, source 

Tsc = Builder(
    action = 'tsc --target ES5 --out $TARGETS $SOURCES', 
    suffix = '.js', src_suffix = '.ts', emitter = modify_targets) 
env = Environment(BUILDERS = { 'Tsc' : Tsc }, 
        BUILD_ROOT = Dir('.'), 
        ENV = { 'PATH' : os.environ['PATH'] }) 
env.Tsc(target = 'deploy/test', source = map(prefix_file, sdk_sources)) 

Вот что происходит после того, как я запускаю его:

tsc --target ES5 --out deploy\test.js src\***.ts src\***.ts 
Error reading file "C:\Program Files (x86)\Microsoft SDKs\TypeScript\lib.d.ts": File not found 
Error reading file "src\***.ts": File not found 
*** repeated many times *** 
scons: *** [deploy\test.js] Error 1 
scons: building terminated because of errors. 

PS. Если я просто запускаю сгенерированную команду из того же каталога, где начинается сборка SCons, сборка завершается успешно.

EDIT:

Подробнее

from subprocess import call 

def name_of(file): return file.abspath 

def tsc(source, target, env): 
    call(['tsc', '--target', 'ES5', '--out', target[0].abspath] + 
     map(name_of, source)) 

Tsc = Builder(action = tsc) 

Этот строитель работает, как ожидалось.

ответ

2

SCons предназначен для создания исходных файлов, которые считаются в структура проекта. Это означает, что исходные файлы должны находиться в одном каталоге или подкаталоге относительно того, где находится скрипт SConstruct корневого уровня.

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

Возможно, вам будет полезно узнать, есть ли возможность указать файлы относительно корневого SConstruct, добавив путь с символом '#'.

Попробуйте это как alterntive:

def prefix_file(file): 
    return os.path.join(File(file).abspath) 
+0

@wvxvw, хорошо я понимаю лучше. SCons вызывает gcc и другие компиляторы одинаково и работает. Я думаю, проблема в том, что tsc нуждается в абсолютном пути. Я добавлю предложение к ответу. – Brady