팁을 먼저 예기하자면 아시는 분들도 있을거라 생각되지만 파일경로에 상위경로인 ..\ 이 사용이 가능합니다.
공개하지 않고 개인이 만들어 쓰는 간단한 애드온들도 있을거라 생각합니다. 그런데 만들어 쓰다보면 기능들이 겹쳐서 라이브러리화 시키거나 전역함수화 시켜서 사용하게 되는데 보통 파일의 위치가 아래와 같이 되죠
● Interface
● AddOns
● MyAddon1
MyAddon1.lua
MyAddon1.toc
● libs
GlobalFunction.lua
MyLib.lua
● MyAddon2
MyAddon2.lua
MyAddon2.toc
● libs
GlobalFunction.lua
MyLib.lua
당연 toc 파일안에 위치는 libs\MyLib.lua 이렇게 될것입니다.
라이브러리수정후 LibStub를 이용해 버전관리만 잘해주면 전혀 문제될것이 없는데
저 같은 경우는 test1, test2 와 같은폴더와 그안에 test1.lua, test2.lua ... 등 파일이 많아 어디에 뭐가 들어있는지 모를때가 많았습니다..;;
그러다보니 애드온을 비활성시키면 애꿎은 곳에서 문제가 발생해 오류가 난 함수명을 전체 찾기로 찾아 일일이 찾아가 파일명 정리하고 복사/붙여넣기해 주고 toc에 다시 적용해 줘야 됩니다.
이게 많이 귀찮죠. 그래서 저는 혼자 만들어 쓰는 애드온들은 전부 아래와 같은 구조를 가지고 있습니다.
● Interface
● AddOns
● libs
GlobalFunction.lua
MyLib.lua
● MyAddon1
MyAddon1.lua
MyAddon1.toc
● MyAddon2
MyAddon2.lua
MyAddon2.toc
toc 파일안에는 ..\libs\MyLib.lua 이와 같이 등록되어 있습니다.
이와 같이 하면 수정할때는 libs 안에 있는 파일만 수정하면 됩니다. 라이브러리를 이곳저곳 복사할 필요가 없어지죠
또한 각 애드온별 toc에 정의된 파일들은 애드온에 속한 파일이 되기 때문에 초기화(시작) 과정에서 애드온별로 동일한 작업을 수행해야 될경우에도 사용이 가능합니다.
예를들어 MyLib.lua 에 아래와 같이 되있습니다.
local addonname, addon = ...
local handler = CreateFrame("frame")
handler:SetScript("OnEvent", function(self, event, ...) addon[event](addon, event, ...) end)
addon.event = setmetatable({SetUnit = function(self, event, ...)
handler:UnregisterEvent(event)
handler:RegisterUnitEvent(event, ...)
end}, {__index = addon,
__newindex = function(self, event, func)
if not func then
handler:UnregisterEvent(event)
elseif not (handler:IsEventRegistered(event)) then
handler:RegisterEvent(event)
end
addon[event] = func or addon[event]
end})
print(addonname)
이것을 MyAddon1, MyAddon2에서 MyLib.lua를 불러왔다면 결과는 MyAddon1과 MyAddon2 를 출력하고 각 네임스페이스에 event 라는 테이블이 생성되며 이벤트를 addon.event:EVENTNAME() 으로 등록이 가능하게 됩니다.