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

Build 如何强制SCON在目标中使用绝对路径而不是相对路径?,build,scons,absolute-path,Build,Scons,Absolute Path,我正在尝试构建一个在Windows上使用tsc(TypeScript编译器)的项目,似乎当SCons调用编译器时,它在错误的目录中调用它。此外,尽管我尽了最大努力,它生成的命令使用相对路径而不是绝对路径,但失败了,下面是执行该命令的代码: 导入操作系统 sdk_sources=[]部分*.ts文件 部署_设置=[]#更多文件 def前缀_文件(文件): 返回os.path.join(Dir('.').abspath,'src',str(文件)) def修改_目标(目标、源、环境): 对于源中的x

我正在尝试构建一个在Windows上使用
tsc
(TypeScript编译器)的项目,似乎当SCons调用编译器时,它在错误的目录中调用它。此外,尽管我尽了最大努力,它生成的命令使用相对路径而不是绝对路径,但失败了,下面是执行该命令的代码:

导入操作系统
sdk_sources=[]部分*.ts文件
部署_设置=[]#更多文件
def前缀_文件(文件):
返回os.path.join(Dir('.').abspath,'src',str(文件))
def修改_目标(目标、源、环境):
对于源中的x:
打印“源:%s”%str(x)
返回目标、源
Tsc=建筑商(
操作='tsc--target ES5--out$TARGETS$SOURCES',
后缀='.js',src_后缀='.ts',发射器=修改_目标)
env=Environment(BUILDERS={'Tsc':Tsc},
BUILD_ROOT=Dir('.'),
ENV={'PATH':os.environ['PATH']})
Tsc(目标='deploy/test',源=映射(前缀文件,sdk源))
下面是我运行它后发生的情况:

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.
如果我只是从同一个目录运行生成的命令,SCons构建将从该目录开始,构建将成功

编辑:

更多信息

来自子流程导入调用
def name_of(file):返回file.abspath
def tsc(源、目标、环境):
调用(['tsc','-target','ES5','-out',target[0].abspath]+
地图(名称、来源)
Tsc=Builder(action=Tsc)

此生成器按预期工作。

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

听起来您试图做的是构建不在项目结构中的源文件,这就是它失败的原因。开发人员已经讨论过在将来的版本中可能会改变这一点,但目前唯一的解决方法是将源文件放在项目结构中

通过在路径前面加上“#”字符,可以知道有一个选项用于指定与根SConstruct相关的文件,这可能会对您有所帮助

请尝试将此作为备选方案:

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

@好的,我现在更明白了。SCons以同样的方式调用gcc和其他编译器,并且可以正常工作。我想问题在于tsc需要绝对路径。我将在回答中添加一个建议。