저는 헬퍼 라이브러리에서 일반적인 루비 로직을 수집하여 요리사의 요리법을 체계적으로 정리하려고합니다. 내부에서 몇 가지 재사용 가능한 메서드를 사용하여 라이브러리 (예 : 클래스 Chef :: Recipe :: MyHelper)에 클래스를 선언하는 예제를 보았습니다. 유사한 방식으로 모듈을 사용하는 예제도 보았습니다. 제 경우에는 몇 가지 방법으로 리소스를 사용하고 싶었습니다.라이브러리 모듈에서 Chef 리소스를 어떻게 사용할 수 있습니까? (아니면 내가 ...)?
예를 들어 서비스 이름을 사용하고 서비스 리소스를 사용하여 각 서비스 이름을 중지하여 루프를 수행하는 도우미 메서드를 제공하고 싶다고 가정 해 보겠습니다. 레시피 파일을 최대한 정리하고 "stopServices (serviceList)"메소드를 호출하여 일부 논리를 유지하려고합니다. 내가 정의하는 경우
은 도우미 라이브러리처럼 내 레시피 그런
class Chef::Recipe::MyHelper
def self.stopServices(serviceList)
serviceList.each do |svc|
service "#{svc}" do
action :stop
end
end
end
end
내가 사용 요리사에 대한 "정의되지 않은 메서드 '서비스':: 레시피 :
MyHelper.stopServices(serviceList)
내가 오류가 발생합니다 : : MyHelper : 클래스 ".
그런 라이브러리에서 리소스를 쉽게 사용할 수 있습니까? (라이브러리에 MyHelper가 클래스 또는 모듈로 포함되어 있는지 여부)? 이게 내가 위반하는 나쁜 습관 일 뿐이야? 나는 많은 검색을했는데 비슷한 것을 묻는 사람을 찾을 수 없기 때문에 어떤 대안을 제시해도 아마 내가 뭔가 다른 일을하고 있다고 믿게된다.
답장을 보내 주셔서 감사합니다. LWRP가 제가 장기간 사용할 수있는 방법이라고 생각합니다. 단기간에 나는 아직도 내가하려고하는 것이 가능한지 궁금해하고 있습니다. 조리법을 정리하기 위해이 방법을 "일반적인"요리 책의 라이브러리 파일로 옮기고 그 요리 책에 의존해야하는 다른 요리 책을 만들었습니다. 클래스 또는 모듈에서 메서드를 래핑하는 데 신경 쓰지 않았고 클래스 줄 (및 "self.")없이 위와 똑같이 작성되었지만 여전히 라이브러리의 메서드에서 리소스를 호출하면 올바르게 작동합니다. – user3525074
기본 네임 스페이스를 오염시키지 않고 "stopServices"대신 "MyHelper.stopServices"를 사용하여 다른 네비게이션에서 메서드가 나오는 위치를 더 명확히하는 것이 가장 좋습니다. 유일한 문제는 클래스에서 랩핑 할 때 서비스 리소스가 해당 클래스의 일부라고 가정한다는 것입니다. 그래서 그것은 단순한 네임 스페이스 문제처럼 보입니다. 리소스 이름을 완전히 한정 할 수있는 방법이 있습니까? 그렇지 않으면이 방법으로 리소스 이름을 지정하는 방법이 있습니까? – user3525074
다시 말하지만, Chef DSL 호출을하기 위해 라이브러리의 사용을 방해하고 있습니다. 이름이 어디에서 왔는지에 대한 단서를 제공하지 않는 클래스를 선언함으로써 클래스를 더 명확하게 만들지는 않습니다 (아마도 'Common'은 더 나은 이름이 될 것입니다). 문제점에 대한 정의를 구현하는 방법을 보여주기 위해 내 대답을 편집했습니다. 장기적으로 당신을 도울 수있는 몇 가지 관찰을 추가했습니다. – cassianoleal