是否可以为单个存储库和多个站点使用通用的netlify.toml文件?

时间:2019-01-13 02:17:00

标签: hugo netlify

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

我有一个名为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文件,因为这两个网站的两个版本的仓库都是相同的。

  

我已经使用Web UI分别配置每个内部版本,但是修改每个内部版本非常麻烦,这就是为什么我更喜欢上面的情况。

我打算做的是让两个构建之间共享所有配置,除了构建命令(构建命令如上所示)外。

1 个答案:

答案 0 :(得分:2)

截至本答案发布之日,Netlify不支持更改netlify.toml中的值的方法,因为它是在构建之前读取的。除了标题和重定向之外,您可以在构建时进行更改。

  

不支持将环境变量直接用作netlify.toml文件中的值($ VARIABLENAME)。

但是

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

这是我根据域名可以完成您想要的事情的方式。

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的这种方法在日志中测试标准输出。子进程捕获输出,并在stdout中将其返回。
  • 我们不想捕获错误,因为我们希望我们的构建因错误而失败,因此这将导致退出代码不是0
  • 您可以使用此解决方案内联其他命令(即“ node ./scripts/custom.js &&部署之前的其他命令”)
  • 您还可以只检查您设置的环境变量,而不是域名