結論から言うとできませんでした。-o オプションが必須です。

以下、調査結果のメモ。

$ bundle exec yard doc したら、doc ディレクトリではなく hoge ディ
レクトリにドキュメントファイルを作りたかったんです。

でも設定ファイルやモンキーパッチではどうにもなりませんでした。

Pull Request 出すしかないけど、そこまでして変えたいわけじゃないか
らなあ…。

-o オプション指定した場合のフロー

$ yard doc -o hoge すると、options.serializer.basepath に ‘hoge’
が入る。

https://github.com/lsegal/yard/blob/v0.8.7.6/lib/yard/cli/yardoc.rb#L652-L655

opts.on('-o', '--output-dir PATH',
        'The output directory. (defaults to ./doc)') do |dir|
  options.serializer.basepath = dir
end

options.serializer は YARD::Serializers::FileSystemSerializer
class のインスタンスで、basepath の setter は以下のように定義され
ている。

https://github.com/lsegal/yard/blob/v0.8.7.6/lib/yard/serializers/file_system_serializer.rb#L9-L11

def basepath=(value)
  @basepath = options[:basepath] = value
end

@basepath はその後、同 class 内の #serialize で参照される。

-o オプション指定しない場合のフロー

前述のフローには入らないので
YARD::Serializers::FileSystemSerializer#basepath は nil のままになる。

どうにかして ‘hoge’ を代入したい。

#new でも代入していることを発見。

https://github.com/lsegal/yard/blob/v0.8.7.6/lib/yard/serializers/file_system_serializer.rb#L27-L31

def initialize(opts = {})
  super
  @basepath = (options[:basepath] || 'doc').to_s
  @extension = (options.has_key?(:extension) ? options[:extension] : 'html').to_s
end

options は継承元の YARD::Serializers::Base で以下のように初期化さ
れている。opts に { basepath: ‘hoge’ } などを渡せれば良さそう。

https://github.com/lsegal/yard/blob/v0.8.7.6/lib/yard/serializers/base.rb#L27-L29

def initialize(opts = {})
  @options = SymbolHash.new(false).update(opts)
end

残念。その余地はありませんでした。

https://github.com/lsegal/yard/blob/v0.8.7.6/lib/yard/cli/yardoc.rb#L20

default_attr :serializer, lambda { Serializers::FileSystemSerializer.new }

まとめ

  • 以上のとおりなので、~/.yard/config で設定してどうにかなるものではない
  • モンキーパッチを書こうにも、Rails みたいな initializer ファイルはない
  • 現在の master も特に実装変わってない