🎯

プロジェクト毎にflutter configを設定する

2021/08/12に公開

前提

  • 2.0.0 より前のversion
    • flutter config を実施すると ~/.flutter_settings に設定ファイルが作成さる
  • 2.0.0 以降のversion
    • flutter config を実施すると ~/.config/flutter/settings に設定ファイルが作成さる

:warning: プロジェクト毎にflutter confignを設定する場合、2.0.0 以降のversion である必要があります。

概要

あるプロジェクトだけしか使わない設定でも、flutter config すると全般に効いてくるので、
特定のプロジェクトだけの flutter config にしたい。

※ もしかしたら需要無いかもですが、気になって調べた際のメモになります。なんかの参考になれば。。

方法

方法としては 2.0.0 以降のversion で設定ファイルが作られる場所を見たら想像付くかと思いますが、
XDG Base Directory仕様になっているので、環境変数 XDG_CONFIG_HOME を設定しておけば、
$XDG_CONFIG_HOME/settings に設定ファイルが作成されるようになります。

運用例

例えば fvmを使っていて、複数プロジェクトそれぞれ別のflutter versionで開発していた場合に、
特定のプロジェクトだけ --build-dir を設定しているが、他のプロジェクトではデフォルトがいい場合、
direnvを使って、特定のプロジェクト直下に、.envrc を以下の内容で作成しておけば、
fvm flutter config xxxx で設定した内容が、.fvm/settings に設定されるようになります。

export XDG_CONFIG_HOME=$PWD/.fvm

この状態で fvm flutter config --enable-web と設定すると .fvm/settings

{
  "enable-web": true
}

が保存されます。

fvm_config.json と一緒にgit管理しとけばメンバー間で共有できて良さそうです :sparkles:

:warning: 注意点としてXDG Base Directory仕様を採用している別のツールなどを一緒に使う場合はそちらも設定ファイルが
.fvm 配下に作られちゃいます。。

補足

実際にconfigを書き出している箇所を調べてみたら、flutterのソースには↓の様になっていました。

  static String _configPath(
      Platform platform, FileSystem fileSystem, String name) {
    final String homeDirFile =
        fileSystem.path.join(_userHomePath(platform), '.${kConfigDir}_$name');
    if (platform.isLinux || platform.isMacOS) {
      if (fileSystem.isFileSync(homeDirFile)) {
        return homeDirFile;
      }
      final String configDir = platform.environment[kXdgConfigHome] ??
          fileSystem.path.join(_userHomePath(platform), '.config', kConfigDir);
      return fileSystem.path.join(configDir, name);
    }
    return homeDirFile;
  }

kXdgConfigHome = XDG_CONFIG_HOME で定義されています。
また、既に ~/.flutter_settings が存在する場合は、そちらの内容を反映するようになっています。
この内容が反映されたのが、 こちらのPR がマージされたタイミングで
それ以前は以下の様な実装になっています。

class Config {
  factory Config(
    String name, {
     FileSystem fileSystem,
     Logger logger,
     Platform platform,
  }) {
    final File file = fileSystem.file(fileSystem.path.join(
      _userHomePath(platform),
      name,
    ));
    return Config._(file, logger);
  }

  // Reads the process environment to find the current user's home directory.
  //
  // If the searched environment variables are not set, '.' is returned instead.
  //
  // Note that this is different from FileSystemUtils.homeDirPath.
  static String _userHomePath(Platform platform) {
    final String envKey = platform.operatingSystem == 'windows'
      ? 'APPDATA'
      : 'HOME';
    return platform.environment[envKey] ?? '.';
  }
}

$HOME/.flutter_settings に書き込むようになっています。

Discussion