Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

import [filename] with task [filename] causes both to execute TWICE?

オープン
#228 コメント 7 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
35/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
ruby
領域
build-system, cli

調査の方向性

Rakefile と foo.rb の例を使って動作を再現し、続いて import のエントリポイントと -T コマンドの経路を追跡します。import されたファイルと同名のタスクがどのようにスケジュールされるか(タスク一覧表示を含む)を確認し、意図した実行回数と -T の動作が明確になるようにテストを追加または更新します。

索引モデルが issue の本文から書いたものです。

説明

I picked up Andrey Koleshko's Rake Task Management Essentials to start learning rake. The book covers the import statement in Chapter 1. After some tinkering, I think I figured out what he was trying to say, but noticed some differences between the behavior he describes in the book and what happens on my machine.

I've copied the relevant section below for reference, but I think the upshot is:

If you import a file, and also define a task with the same name as that file, then that task will be run before the file is imported. This feature is provided so that dependency files may be generated on-the-fly.

...The import statement may be used in any line of the Rakefile, and this doesn't apply to the loading process at all. The imported files will be loaded after the whole Rakefile is loaded. Its usage looks similar to the require statement and is shown in the following line of code:

import(filename)

Here, you are able to pass more than one file.

There is one more feature of the import method. If you pass the filenames to the import task, they are evaluated first, and this allows us to generate the dependent files on the fly. Look at the following Rakefile:

task 'dep.rb' do
  sh %Q{echo "puts 'Hello, from the dep.rb'" > dep.rb}
end

task :hello => 'dep.rb'

import 'dep.rb'

This example generates the dep.rb file on the file due to the import 'dep.rb' call that evaluates the 'dep.rb' task. The result of the hello task execution is shown as follows:

$ rake hello
echo "puts 'Hello, from the dep.rb'" > dep.rb
Hello, from the dep.rb

The problem is that on my machine, the aforementioned pre-import task runs twice:

# Rakefile
import 'foo.rb'

task 'foo.rb' do
  puts "I'm a little teacup,"
end
# foo.rb
puts "short and stout!"
$ rake foo.rb
I'm a little teacup,
short and stout!
I'm a little teacup,
short and stout!

At first, I thought this was happening because I was explicitly calling the foo.rb task, so maybe that was running once because I called it and again in response to the import statement — but then I tried running a different task altogether:

# Rakefile
import 'foo.rb'
    
task 'foo.rb' do
  puts "I'm a little teacup,"
end

task :bar

and I get the same duplicated output as before:

$ rake bar
I'm a little teacup,
short and stout!
I'm a little teacup,
short and stout!

In fact, it doesn't just spit out the same input twice; it actually runs twice, from start to finish:

# Rakefile
import 'foo.rb'
    
task 'foo.rb' do
  if !File.exist?('foo.rb')
    puts 'Where is foo.rb?'
    `echo "puts 'I\'m right here.'" > foo.rb`
  else
    puts 'Oh, I didn\'t see you there.'
    `echo "puts 'Sorry, I got held up in traffic.'" > foo.rb`
  end
end
$ rm foo.rb
$ rake foo.rb
Where is foo.rb?
I'm right here.
Oh, I didn't see you there.
Sorry, I got held up in traffic.

Is this the expected behavior, or does this constitute a bug in rake?


On a related note, the command-line flag -T is supposed to display a list of all the rake tasks that have descriptions, but when running rake -T against the above Rakefile, the import directive causes the corresponding task to run anyway:

$ rake -T
I'm a little teacup,
short and stout!
I'm a little teacup,
short and stout!

Is this the expected behavior, or does this constitute a bug in rake?


FWIW I'm on Ruby 2.4.0 / Rake 12.0.0

主要言語
Ruby
スター
2.5k
フォーク
650
平均マージ
6分
マージ済み PR(30日)
3

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

ruby/rake のほかの issue

ruby/rake の issue をすべて見る

似ている issue

Ruby の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。