process.env.PWD 不适用于 mupx 部署

process.env.PWD doesn't work on mupx deploy

我在服务器上的 Meteor 项目中有这段代码。它将字体文件加载到 PDF 生成包中:

doc.font(process.env.PWD + '/public/[...]');

这在我的本地机器上工作正常,但在部署中我记录了这个错误:

Error: ENOENT, no such file or directory '/bundle/bundle/public/[...]'

PDF 包正在使用 fs.readFileSync 尝试阅读此文件。

我正在使用 mupx [使用 Docker] 的 Meteor Up 开发分支进行部署。

为什么 process.env.PWD 不再正确引用我项目的正确根目录?问题是否与 mup[x]/Meteor 为创建 Meteor 应用程序的生产版本所做的构建脚本有关?

我找不到如何做到这一点/也许还没有 Meteor 方法来做到这一点。所以我目前的解决方案是检查 production/development 并为前缀设置一个变量:

if (process.env.NODE_ENV === 'development') {
  prefix = process.env.PWD + '/public';
} else {
  prefix = '/bundle/bundle/programs/web.browser/app';
}

这个前缀变量让你到达 /public

默认情况下,对于 Mup 应用程序,public 目录通常位于类似于 ./programs/web.browser/app/ 的位置。

我认为私人目录位于 ./programs/server/assets/app/.

因此,使用服务器端文件结构 -(显然这是基于服务器的方法 运行 - 例如 Meteor.methods)和私人文件(将字体放在 /private/fontfile .xss').

var font_file_name = 'fontfile.xxx';
var server_root = Npm.require('fs').realpathSync( process.cwd() );
var font_path = server_root + '/assets/app/' + font_file_name;

这应该适用于两台服务器和您的本地操作。

这样解决了:

Meteor.startup(function() {
  routePath = fs.realpathSync('./../../../../../public');
})

但我用的是 .uploads 而不是 public。在 public 旁边的项目级别创建 .uploads。优点是您的 Meteor 应用程序不会每次都监视 .uploads 的变化。