有什么方法可以为单个存储库和多个站点提供一个通用 netlify.toml 文件?

Any way to have a common netlify.toml file for a single repository and multiple sites?

我正在寻找一种在 netlify 上定义两个站点构建的方法,它们来自同一个 repo,使用一个公共 netlify.toml。可以这样做吗?

我有一个名为 hugo-dream-plus 的 GitHub 存储库,我在 netlify 上为其配置了两个网站构建,即 dream-plus-postsdream-plus-cards。这两个构建共享相同的环境变量和大部分配置,除了构建命令:

hugo --config cards.toml     #For dream-plus-cards
hugo --config posts.toml     #For dream-plus-posts

我想知道是否有办法创建一个通用的 netlify.toml 文件,因为对于这两个站点,这两个版本的回购都是相同的。

I've already used the web UI for configuring each build separately, but it's quite bothersome to modify each of them, that's why I'm preferring the above scenario.

我打算做的是在两个构建之间共享所有配置,除了构建命令,它将单独定义,如上所示。

截至此答案发布之日,Netlify 不支持更改 netlify.toml 中的值的方法,因为它是在构建之前读入的。 headers 和重定向除外,它们允许您在构建时进行更改。

Using Environment Variables directly as values ($VARIABLENAME) in your netlify.toml file is not supported.

但是

您可以 运行 脚本命令并根据域或环境变量更改它。 有一些设置可行。

这里是我如何根据域名完成你想要的。

netlify.toml

[build]
  command = "node ./scripts/custom.js"
  publish = "public"

scripts/custom.js

const exec = require('child_process').exec;
const site = process.env.URL || "https://example.com";
const domain = site.split('/')[site.split('/').length - 1];

let buildCommand;
switch(domain) {
  case "dream-plus-posts.netlify.com":
    buildCommand = 'hugo --config posts.toml';
    break;
  case "dream-plus-cards.netlify.com":
    buildCommand = 'hugo --config cards.toml';
    break;
  default:
    throw `Domain ${domain} is invalid`;
}

async function execute(command){
  return await exec(command, function(error, stdout, stderr){
    if (error) {
      throw error;
    }
    console.log(`site: ${site}`);
    console.log(`domain: ${domain}`);
    console.log(stdout);
  });
};

execute(buildCommand);

注意事项:

  • 我没有在 Hugo 中使用这种方法测试日志的标准输出。 child 进程捕获输出并 returns 在标准输出中。
  • 我们不想捕获错误,因为我们希望我们的构建因错误而失败,因此这将导致退出代码不是 0
  • 您可以使用此解决方案内联其他命令(即 "node ./scripts/custom.js && some other command before deploy")
  • 您也可以只检查您设置的环境变量而不是域名