如何强制SCons在目标中使用绝对路径而不是相对路径?

时间:2013-05-20 12:26:55

标签: build scons absolute-path

我正在尝试在Windows上构建一个使用tsc(TypeScript编译器)的项目,看起来当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构建开始的同一目录运行生成的命令,则构建成功。

修改

更多信息

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)

此构建器按预期工作。

1 个答案:

答案 0 :(得分:2)

SCons旨在构建在项目结构中被视为 的源文件。这意味着源文件必须位于相同目录或相对于根级SConstruct脚本所在位置的子目录中。

听起来你正在尝试做的是构建不在项目结构中的源文件,这就是它失败的原因。开发人员已经谈到可能在未来的版本中更改它,但是现在唯一的办法是将源文件放在项目结构中。

通过在路径前加上“#”字符,您可以了解指定相对于根SConstruct的文件的选项。

尝试将其作为替代方案:

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