Class: Pindo::TaskSystem::TaskResources::DirectoryBasedResourceType

Inherits:
ResourceType
  • Object
show all
Defined in:
lib/pindo/module/task/task_resources/types/directory_based_resource.rb

Overview

基于目录的资源类型

特性:

  • 相同目录的资源互斥(不能并发)

  • 不同目录的资源可以并行

适用资源:

  • Xcode(相同项目目录互斥)

  • Git(相同仓库目录互斥)

  • Unity(相同项目目录互斥)

  • Gradle(相同项目目录互斥)

Instance Attribute Summary

Attributes inherited from ResourceType

#name, #strategy

Instance Method Summary collapse

Methods inherited from ResourceType

#directory_based?, #global_exclusive?, #global_shared?, #to_s

Constructor Details

#initialize(name) ⇒ DirectoryBasedResourceType

Returns a new instance of DirectoryBasedResourceType.

Parameters:

  • name (Symbol)

    资源名称



19
20
21
# File 'lib/pindo/module/task/task_resources/types/directory_based_resource.rb', line 19

def initialize(name)
  super(name, :directory_based)
end

Instance Method Details

#conflicts?(instance1, instance2) ⇒ Boolean

检查两个资源实例是否冲突规则:

  1. 如果任一资源未指定目录,视为全局冲突(为了安全起见,防止漏锁)

  2. 相同目录冲突

  3. 不同目录不冲突

Parameters:

Returns:

  • (Boolean)


32
33
34
35
36
37
38
39
40
41
42
# File 'lib/pindo/module/task/task_resources/types/directory_based_resource.rb', line 32

def conflicts?(instance1, instance2)
  dir1 = instance1.context[:directory]
  dir2 = instance2.context[:directory]

  # 修改:如果任一资源没有指定目录,视为冲突(Fail-safe 策略)
  # 这确保了如果某个任务忘记或者无法指定目录,它会独占该类型资源,而不是并发执行
  return true if dir1.nil? || dir2.nil?

  # 规范化路径后比较
  normalize_path(dir1) == normalize_path(dir2)
end