Syncing with Rojo
Introduction
The role of roblox-ts is to turn TypeScript (.ts) files into Luau files (.lua). That alone isn't very useful! You need to move the files into Roblox Studio to be able to use them for a game, plugin, model, etc.
To do this, you can use Rojo!
Rojo takes files from your local filesystem and will either:
- turn them into a single Roblox file (
.rbxm,.rbxl,.rbxmx, or.rbxlx) viarojo build - sync them into an open Roblox Studio session via
rojo serve
Rojo uses a default.project.json file to describe how files should be organized within a Roblox file.
Your default.project.json file should have all "$path" fields relative to your outDir (which is the "out" folder by default).
The workflow should look like this:
.ts files in src
roblox-ts via rbxtsc
.lua files in out
Rojo via rojo build or rojo serve
Roblox Studio 🎉
roblox-ts will use your project.json file to understand how TypeScript (.ts) files eventually end up inside of Roblox Studio. This is primarily used for compiling import statements.
To use a different project.json file instead of default.project.json for compiling, you can use the --rojo flag:
rbxtsc --rojo other.project.json
Customization
Like any other Rojo project, you can organize a roblox-ts project however you'd like with a few restrictions:
- The
includefolder andnode_modulesfolder must be in a place that is visible to both the client and server - All
"$path"fields should be relative to youroutDir(which is the"out"folder by default)
By default, the default.project.json file should look something like this (truncated):
{
"name": "roblox-ts-game",
"tree": {
"$className": "DataModel",
"ServerScriptService": {
"$className": "ServerScriptService",
"TS": {
"$path": "out/server" // server folder goes in ServerScriptService.TS
}
},
"ReplicatedStorage": {
"$className": "ReplicatedStorage",
// this _must_ stay the same (except for the name)
"rbxts_include": {
"$path": "include",
"node_modules": {
"$path": "node_modules/@rbxts"
}
},
"TS": {
"$path": "out/shared" // shared folder goes in ReplicatedStorage.TS
}
},
"StarterPlayer": {
"$className": "StarterPlayer",
"StarterPlayerScripts": {
"$className": "StarterPlayerScripts",
"TS": {
"$path": "out/client" // client folder goes in StarterPlayer.StarterPlayerScripts.TS
}
}
}
}
}
You can find the full version here.
Example
Suppose you wanted to add scripts to StarterPlayer.StarterCharacterScripts.
To do this, we'll need to add a folder to src (so that when we compile it will have a matching folder in out). We'll call this src/character.
Then, we need to update our default.project.json:
"StarterPlayer": {
"$className": "StarterPlayer",
"StarterPlayerScripts": {
"$className": "StarterPlayerScripts",
"TS": {
"$path": "out/client"
}
},
"StarterCharacterScripts": {
"$className": "StarterCharacterScripts",
"TS": {
"$path": "out/character"
}
}
}