查找项目目录的绝对基本路径

时间:2013-08-22 11:11:35

标签: node.js meteor fs

到目前为止,我们可以使用以下代码片段获取稍后以readStream打开的文件的绝对路径:

var base = path.resolve('.');
var file = base + '/data/test.csv';

fs.createReadStream(file)

自Meteor 0.6.5以来,基本路径指向.meteor/local/build/programs/...

还有Assets API,但它不能给我们一个路径但只返回读取文档。我们需要一个流来处理一些更大的数据文件吗?

7 个答案:

答案 0 :(得分:58)

现在找到项目根目录的另一种方法是:

var base = process.env.PWD

请注意,这与process.cwd()不同。相反,它是您运行meteor命令的目录,这通常是您要查找的内容。另请注意,从部署的捆绑包运行应用程序时,这可能不会非常有用。

答案 1 :(得分:16)

当我更新到0.6.5时,我遇到了同样的困境。

我目前正在做的是这样的道路:

var meteor_root = Npm.require('fs').realpathSync( process.cwd() + '/../' );

这将在开发模式下返回

/my/application/.meteor/local/build/programs

在捆绑模式下

/my/application/build/app/programs

所以从这里开始,我就像我的应用程序的“根”路径一样:

var application_root = Npm.require('fs').realpathSync( meteor_root + '/../' );

// if running on dev mode
if( Npm.require('path').basename( Npm.require('fs').realpathSync( meteor_root + '/../../../' ) ) == '.meteor' ){
    application_root =  Npm.require('fs').realpathSync( meteor_root + '/../../../../' );
}

唯一可能失败的情况是,如果您碰巧将应用程序的文件夹命名为“.meteor”,那就是边缘情况。

相对于此,您可以访问您需要的任何其他内容。

此外,您还可以直接访问meteor bundler创建的assets文件夹:

var assets_folder = meteor_root + '/server/assets/' + Npm.require('path').basename( application_root );

这可能是暂时的,因为我希望最终添加更好的文件/路径交互API ..

希望有所帮助

答案 2 :(得分:6)

嘿,你不需要像上面的答案一样进行硬编码......看看This package

安装后,您可以访问流星的根路径,只需Meteor.rootPath

答案 3 :(得分:6)

从版本1.3开始,documented功能

include ../../../build.mak include ../../../build/common.mak export LIBDIR := ../../lib RULES_MAK := $(PJDIR)/build/rules.mak export G729_CODEC_LIB := libg729codec-$(TARGET_NAME)$(LIBEXT) export _CFLAGS := $(CC_CFLAGS) $(OS_CFLAGS) $(HOST_CFLAGS) $(M_CFLAGS) \ $(CFLAGS) $(CC_INC)../.. $(CC_INC)../../g729/Headers \ $(CC_INC)../../../pjlib/include export _CXXFLAGS:= $(_CFLAGS) $(CC_CXXFLAGS) $(OS_CXXFLAGS) $(M_CXXFLAGS) \ $(HOST_CXXFLAGS) $(CXXFLAGS) export _LDFLAGS := $(CC_LDFLAGS) $(OS_LDFLAGS) $(M_LDFLAGS) $(HOST_LDFLAGS) \ $(LDFLAGS) export G729_CODEC_SRCDIR = ../../g729 export G729_CODEC_OBJS = Sources/acelp_ca.o Sources/cod_ld8a.o Sources/dec_gain.o Sources/dspfunc.o Sources/g729a_encoder.o \ Sources/lpcfunc.o Sources/oper_32b.o Sources/post_pro.o Sources/pred_lt3.o Sources/tab_ld8a.o \ Sources/basic_op.o Sources/cor_func.o Sources/dec_lag3.o Sources/filter.o Sources/gainpred.o \ Sources/lspdec.o Sources/p_parity.o Sources/postfilt.o Sources/qua_gain.o Sources/taming.o \ Sources/bits.o Sources/de_acelp.o Sources/dec_ld8a.o Sources/g729a_decoder.o Sources/lpc.o \ Sources/lspgetq.o Sources/pitch_a.o Sources/pre_proc.o Sources/qua_lsp.o Sources/util.o export G729_CODEC_CFLAGS = $(_CFLAGS) TARGETS := $(G729_CODEC_LIB) all: $(TARGETS) doc: cd .. && doxygen docs/doxygen.cfg dep: depend distclean: realclean .PHONY: dep depend clean realclean distclean .PHONY: $(TARGETS) .PHONY: $(G729_CODEC_LIB) libg729codec: $(G729_CODEC_LIB) $(G729_CODEC_LIB): $(MAKE) -f $(RULES_MAK) APP=G729_CODEC app=libg729codec $(subst /,$(HOST_PSEP),$(LIBDIR)/$@) clean print_lib: $(MAKE) -f $(RULES_MAK) APP=G729_CODEC app=libg729codec $@ realclean: $(subst @@,$(subst /,$(HOST_PSEP),.libg729codec-$(TARGET_NAME).depend),$(HOST_RMR)) $(MAKE) -f $(RULES_MAK) APP=G729_CODEC app=libg729codec $@ depend: $(MAKE) -f $(RULES_MAK) APP=G729_CODEC app=libg729codec $@

似乎是可靠地获得项目路径的最佳方式。

Meteor Github

答案 4 :(得分:4)

对于流星0.8.3,

__meteor_bootstrap__.serverDir在服务器模式下运行时给出工作目录。

例如

if (Meteor.isServer) {
   console.log(__meteor_bootstrap__.serverDir);
}

答案 5 :(得分:2)

您可以通过以下方式获取项目的基本根路径

process.env.PWD

答案 6 :(得分:1)

从Meteor 1.2.1开始,这对我有用:

var absoluteBasePath = path.resolve('../../../../../.');

使用split的结果相同:

var absoluteBasePath = path.resolve('.').split(path.sep + '.meteor')[0];

使用process.cwd()

var absoluteBasePath = path.resolve(process.cwd(), '../../../../../');
var absoluteBasePath = path.resolve(process.cwd()).split(path.sep + '.meteor')[0];