How to determine whether any prerequisite tasks needed to run at the time they were defined?
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 42/100
- issue の種類
- 機能追加
- 明瞭さ
- おおむね明確
- 活発さ
- 停滞
- 技術スタック
- ruby
- 領域
- build-system
調査の方向性
issue に示されている Rake::Task のエントリポイント、#needed?、#already_invoked、#execute、#enhance、invoke_prerequisites から始めます。それぞれの状態がいつ変化するかを追跡し、実際に実行された prerequisite と、呼び出されただけの prerequisite を区別する方法を明らかにします。両方のケースについて動作が仕様化され、テストでカバーされていれば完了です。
索引モデルが issue の本文から書いたものです。
説明
I have a use-case in which I need to run a task if and only if at least one of its prerequisite tasks either (1) currently needs to run or (2) needed to run at the time the prerequisite task was defined. Here are some attempts at a Rake::Task subclass:
class MyTask < Rake::Task
def needed?
prerequisite_tasks.any?(&:needed?)
end
end
This approach does not work, since at the time MyTask#needed? is called, prerequisite tasks may have run and therefore return false for #needed?.
class MyTask < Rake::Task
def needed?
prerequisite_tasks.any? { |p| p.needed? or p.already_invoked }
end
end
This also doesn't work, since #already_invoked can return true [even if the task's #execute method was never called]:
@already_invoked = true
invoke_prerequisites(task_args, new_chain)
execute(task_args) if needed?
What ended up working was:
class MyTask < Rake::Task
def initialize(*)
@needed = false
super
end
def enhance(*)
super.tap { @needed |= prerequisite_tasks.any?(&:needed?) }
end
def needed?
@needed
end
end
But that just feels... wrong. Is there something I'm missing here? I'd be more than happy to open a PR implementing what I'm looking for (maybe an #already_executed method?) if this functionality doesn't already exist.
Thanks!
- 主要言語
- Ruby
- スター
- 2.5k
- フォーク
- 650
- 平均マージ
- 6分
- マージ済み PR(30日)
- 3
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
ruby/rake のほかの issue
-
難易度 3/5 1〜2日 初心者へのやさしさ 68/100
-
難易度 3/5 1〜2日 初心者へのやさしさ 48/100
-
難易度 5/5 1週間以上 初心者へのやさしさ 28/100
-
難易度 1/5 1時間未満 初心者へのやさしさ 45/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 38/100
似ている issue
-
SyncEm always forwards a dummy block, so wrapped methods lose their no-block/Enumerator behavior オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
endoflife-date/endoflife.date#11086 ·
-
internal
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
Kong/developer.konghq.com#7322 ·
-
bug P2
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100