Hi Ryan, How about adding a symbolic link to libraries under each App Server root?
There are 3 issues (that I can think of at the moment...) to think about wrt the Modules directory: 1) Paths will not be able to be relative to your Modules under your App Server root (you already mentioned this). 2) You have to replicate the Modules for each installation of MarkLogic and for each node in the cluster. 3) You have to be careful about naming of things, because MarkLogic owns that directory, and if in a future release, MarkLogic ships a module under Modules with the same path as your file, then your file will be overwritten. This is unlikely to happen, but you should still worry about it. -Danny From: [email protected] [mailto:[email protected]] On Behalf Of [email protected] Sent: Friday, July 08, 2011 10:00 AM To: [email protected] Subject: [MarkLogic Dev General] Installing custom code under MarkLogic_install_dir/Modules Background: I'm looking for a way to install code and content on a MarkLogic installation so that it is available to any other application that gets installed. This is more then just including common code, but includes read-only XML files we want to insert into the DB. For example, we may have a Client Device Detection Library that has the WURFL xml file and code to use it as part of it's installation. Now any other application in this MarkLogic installation can just call some convenience functions to do device detection. The problem: When you create an app server you specify the root. The code for that app server can only see files under that root. So if I want to install common code and also three applications, my directories in my Modules database might look like this: /code |- libraries |- devices |- appA |- appB |- appC The code under appA cannot see or execute anything under libraries (as far as I know). So how can I install common code once and allow other apps to use it? Option 1: I could include the "libraries/devices" directory and code under each application (appA/libraries/devices, appB/libraries/devices, etc.). That's not a single installation of common code anymore and is not how I'd like to maintain the code. Option 2: I could make the root for all apps "/" instead of "appA", "appB", etc. then each app would be have access to "/libraries/devics". But then I'd have to refactor all my code to change the import paths (/appA/default.xqy, etc.). Plus I don't like having to specify in the context in the code for every app. Then every app could potentially execute code it shouldn't. Option 3: Install the code under <MarkLogic_install_dir>/Modules. This would allow there to be a single install of code that all apps could use. I have tested this and it works, but there's some behavior that I was uncertain of: It appears that when MarkLogic compiles my code, it links it with other existing code. If it doesn't find some imported code, it throws a 500 error saying it can't find the code. Once I add the code at the correct path (under <MarkLogic_install_dir>/Modules in this case), I still get a 500 error until I change the referring code. Meaning, I have to touch the app code so it recompiles and links to the now existing code under <MarkLogic_install_dir>/Modules. Is this a recommended approach for production applications? So is there a better way to handle common code? Is putting it under <MarkLogic_install_dir>/Modules my best option, and are there implications around using this options that I should watch out for? Thanks, Ryan
_______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
