Managing Cross-Project Resources using Symbolic Links

I write plugins that support both MV and MZ at the same time, mostly for personal convenience so that I don’t need to maintain two different releases when it’s basically the same code except maybe one has a little extra MZ-specific logic like registering a plugin command or something.

But for the most part, the majority of plugins I’ve been looking at are basically the exact same code.

So the question is, would it be possible to have the exact same folder structure for one project…but the contents of the project point to another project?

Example

For example, let’s say I have two projects as follows

So there’s Project1 and then there’s Project2. Two different projects, same folder structure.

Now in Project1, I have a Community_Basic plugin and a TitleSkip plugin.

With Project1 open in the editor, when I go and add my plugins, I see the plugins, as expected. Nothing special, just usual RM things.

In Project2, I have some different plugins, called “cool_stuff” and “other_thing”.

Now what if I wanted to use the cool_stuff and the other_thing in both projects?

How about a Shortcut?

So you might be familiar with shortcuts. You put a shortcut to a folder on your desktop so that you can quickly access a specific folder somewhere on your computer. We can try to create a shortcut by right-clicking and creating a shortcut, then calling it “plugins”

But it doesn’t do anything. This is because it just creates a link that your computer uses to go to another file or folder.

Enter Symbolic Links

So most operating systems have something called symbolic links which is kind of like a shortcut…but a more powerful shortcut.

On Windows, you can use mklink on command-line (running in admin mode). So for example you can say

mklink /D source target

mklink /D "D:\Links\Project1\js\plugins" "D:\Links\Project2\js\plugins"

And that will create a link between them (you’ll have to rename your existing plugins folder otherwise it will say the folder already exists) . On other OS you’ll have to figure out the equivalent command.

There’s also a tool someone made for Windows called “symlinker” which allows you to create symbolic links (or other types of links) using a GUI interface, which is nice if you don’t want to deal with command-line. For this tutorial I will just use that program since it’s easier

So I create a folder symbolic link inside Project1 called “plugins” which refers to the plugins folder in Project2.

This results in a plugins folder in Project1 that looks like a shortcut, and when you click on it, it will jump to the plugins folder in Project2

However the biggest difference is, suddenly the editor is pulling the plugin data from Project2‘s plugins folder instead! If you look at the screenshot, I still have Project1‘s original plugin settings…but when I try to add new ones, it shows a different set.

In Summary

Now I can manage all of my plugins for two different projects in the same folder, and the changes I make to one project, will automatically be reflected in the other project because they’re all pointing to the same files.

This technique could be used for other resources as well, such as audio, images, and so on. Since MV and MZ use basically have the same specifications, I can just have one copy of all my resources and share them between different projects!

This can be a useful technique depending on your needs. For most devs it probably won’t be too useful, but if you’re in a specific situation where you wanted to test in different environments, it save a lot of effort.

Like this Article?

If you like my content and would like to see more, consider becoming a patron today! As a patron, you can get access to patron-exclusive content such as early access plugins, or the option to advertise your games or resources depending on your monthly pledge amount.

A small monthly donation is all that I ask for in exchange for free plugins and tools for the RPG Maker community.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *