我正在使用create-react-app,Travis CI和netlify。我有一个如下所示的配置文件:
require('dotenv').load();
module.exports = {
API_BASE_URL: process.env.REACT_APP_DATABASE_URL || 'http://localhost:8080'
}
当我尝试部署到Netlify时,我在Travis中收到此错误:
Creating an optimized production build...
Failed to compile.
Failed to minify the code from this file:
./node_modules/dotenv/lib/main.js:23
如果我删除了require(' dotenv')。load();部分,它加载,但然后应用程序尝试转到localhost,这显然不是我想要的。
这篇文章:https://github.com/motdotla/dotenv/issues/261
提出了同样的问题,但他们没有提供解决方案。我被卡住了。救命啊!
答案 0 :(得分:2)
免责声明:我为netlify工作。
TL; DR unix shell使事情变得复杂。
在Netlify中使用环境变量的首选方法是在我们的环境中设置它们 - 在构建环境变量配置小部件中(第二个在"构建和部署设置"页面 - 在您的环境下) repo + build命令部分),或通过netlify.toml(https://www.netlify.com/docs/continuous-deployment/#deploy-contexts)。后者更灵活,因为您可以为不同的上下文设置不同的值 - 例如staging使用暂存DATABASE_URL,生产使用生产暂存。
所以 - 那些变量是"可用"在构建环境中 - 如果你的构建命令是env
,那么你会看到它们 - 除了$ PATH和$ NODE_VERSION以及Netlify自动设置的其他东西。但是,根据构建管道的工作方式,它们可能在其中可用,也可能不在其中。如果您的构建命令是node -p "process.env"
- 它将显示哪个节点看到环境变量 - 并且应该显示与env
显示相同的内容(这是由build script运行的shell看到)。
不幸的是,许多人使用DON&T; T的构建管道会自动从父shell导入/继承变量。这个帖子显示了这样一个例子:https://github.com/theintern/intern/issues/136#issue-26148596。所以 - 最好的做法并不是必须使用像dotenv这样的东西(虽然这对那些不想尝试缩小它的人来说很有用:)) - 而是使用一个构建过程来适当地传递我们公开的那些环境变量在shell中,进入构建环境。你如何做到这一点取决于你和你的工具。
另一个PS:除非您的构建管道与环境变量有关 - 它在发布并提供给浏览器的代码中没有多大用处 - 它不会理解{{ 1}} - 这只是浏览器的一个字符串。我知道你并没有尝试这样做,但是想要为后来可能会看到这个答案的人们指出这一点 - 这是静态网站的新开发者之间常见的误解。