Я пытаюсь создать проект, который использует 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)
Этот строитель работает, как ожидалось.
@wvxvw, хорошо я понимаю лучше. SCons вызывает gcc и другие компиляторы одинаково и работает. Я думаю, проблема в том, что tsc нуждается в абсолютном пути. Я добавлю предложение к ответу. – Brady