This is a monorepo starter powered by:
$base
links so stand-alone app links will workv0.11.7
plop app
to work w/ new layout structure^1.0.0-next.570
^3.1.8
@packages/*
between @apps/*
pnpm clean
scriptpnpm dev
pnpm build
(turborepo build under hood)pnpm preview
dev
, beta
, and prod
to real web hostenv
variables shared in packages
@oneezy/components
GitHub repo + NPM package for sharing components between projectswebsites and webapps live in the ./apps
folder. They all live at the same level but the app routes are symlinked into the +app (main app) directory so they inherit Sveltekit's SPA routing system (Single Page Application).
libraries, configs and components live in the ./packages
folder.
dependencies
and devDependencies
between alls appsPrereqs
node v18.8.0 (or later)
pnpm v7 (or later)image.png
Installation
degit oneezy/monorepo my-app
pnpm i
+ start all apps
pnpm dev
+ start single app
pnpm dev --filter @apps/site
+ production build all apps
pnpm build
+ production preview all apps
pnpm preview
+ production preview single app
pnpm preview --filter @apps/dev
This monorepo makes use of symlinks to handle 2 separate scenarios. if you plan on using either you will need to follow the steps below for your app(s) to work properly. Learn more about symlinks by clicking here.
PROTIP: Quickly generate an app using plop !
pnpm plop app
symlink static assets
this monorepo only uses one folder for static assets located at ./apps/+app/static
so you will need to symlink that static
folder into every app you add to the apps/*
folder to get static assets working (this may change in the future but this is how we're handling it at the moment).
This is automatically handled for you when you
pnpm i
anywhere.
symlink app routes
if you want to link entire apps together as routes you will need to symlink your ./apps/my-app/src/routes
directory into the main ./apps/+app/src/routes
directory.
This is automatically handled for you when you
pnpm i
anywhere.
Components are the building blocks of your apps.
PROTIP: Quickly generate a component using plop !
pnpm plop component
or do it manually...
- create new component in
./packages/components/src
directory- export new component from
./packages/components/index.js
file
./apps/site/src/routes/index.svelte
<script>
import { MyComponent } from '@packages/components';
</script>
## Add Package
1. create new folder in `./apps` (i.e. `docs`)
2. create new folder in `./packages` (i.e. `components`)
3. go to `components` folder and create `package.json` with proper namespace
```json
{
"name": "@packages/components",
"version": "0.0.0",
"type": "module",
"main": "index.js"
}
pnpm add
command
cd apps/docs
pnpm add @packages/components
pnpm adds the workspace at the bottom of your
docs/package.json
"dependencies": { "@packages/components": "workspace:*" }
package.json
Make sure to modify the contents in the project's root package json to fit your needs.
Package.json
inheritance from @packages/dependencies
You can create base package.json
's to inherit from each other.
i.e.
packages/dependencies/package.shared.json
{
"devDependencies": {
"svrollbar": "^0.12.0",
"svelte-accessible-accordion": "^2.1.0"
},
"dependencies": {
"@packages/config": "workspace:*",
"@packages/metadata": "workspace:*",
"@packages/components": "workspace:*"
}
}
And then add it to the app's package.json
like...
"name": "@apps/site",
"inherits": [
"@packages/dependencies/package.svelte.json",
"@packages/dependencies/package.shared.json"
],
If you want to run multiple dev enviornments in parallel, you will have to define different ports in each of your apps package.json
npm scripts (i.e. -p 4000
). Each apps port will need to be different.
"name": "@apps/docs",
"version": "0.0.0",
"scripts": {
"dev": "vite dev --port 4000",
"build": "vite build",
"preview": "vite preview --port 4000"
},
You have 1 of 3 options. If you try to create a symlink without one of these, you will see:
Failed to create symbolic link 'link' : Operation not permitted
Command Prompt
, Git Bash
or WSL
cd
to go into your project where you want to add the symlink
cd C:\Users\oneezy\Desktop\sveltekit-symlinks\src\routes
symlink
(not absolute!) to a directory folder (not a file!)
mklink /D my-new-symlink ..\..\symlinked-docs
You may also need to enable symlinks in your .gitconfig
user profile.
git config --global core.symlinks true
This will add the
symlinks = true
toC:\Users\username\.gitconfig
[core] symlinks = true
You may also need to manually add symlinks = true
to the gitconfig inside C:\Program Files\Git\etc\gitconfig
if it's not there already
[core]
symlinks = true
cd
to go into your project where you want to add the symlink
cd c/users/oneezy/desktop/sveltekit-symlinks/src/routes
symlink
(not absolute!) to a directory folder (not a file!)
ln -s ../../../docs docs
PROTIP: To see a list of your symlinks use the
ls -l
commandoneezy@oneezy MINGW64 ~/Desktop/sveltekit-symlinks/src/routes (main) $ ls -l
rw-r--r-- 1 oneezy 197609 1354 Jun 1 13:00 index.svelte +lrwxrwxrwx 1 oneezy 197609 20 Jun 1 20:45 docs -> ../../docs/
# Deploying
This uses Sveltkits `adapter-auto` and is being deployed to [Vercel](vercel.com) but you may need to change it depending on how you want to deploy.
**BUILD COMMAND**
pnpm build --filter @apps/app
**ROOD DIRECTORY**
apps/+app
![image](https://user-images.githubusercontent.com/7369575/205485770-146beac8-a7a8-4e09-bc61-f985c2b53b64.png)
# References
**Monorepo**
- [π½οΈ Building Svelte Society: Monorepos with pngwnπ§](https://youtu.be/gKxz7R9dX0w)
- [π½οΈ Monorepos: Any Size Fits All, by Altan Stalker](https://www.youtube.com/watch?v=elKsZvowdok)
- [π§ How to Setup a PNPM Monorepo (Wes Bos and Scott Telenski)](https://syntax.fm/show/401/hasty-treat-how-to-setup-a-pnpm-monorepo)
- [π§ Monorepos! Workspaces, pnpm, turborepo + more! (Wes Bos and Scott Telenski)](https://syntax.fm/show/426/monorepos-workspaces-pnpm-turborepo-more)
- [π Visual Studio Code tips for monorepo development](https://medium.com/rewrite-tech/visual-studio-code-tips-for-monorepo-development-with-multi-root-workspaces-and-extension-6b69420ecd12)
- [π Exploring The Monorepo (6 Part Series)](https://dev.to/jonlauridsen/series/12073)
- [π Mono repository done right!](https://blog.ghaiklor.com/2020/07/12/mono-repository-done-right/)
- [π Replacing Lerna + Yarn with PNPM Workspaces](https://www.raulmelo.dev/blog/replacing-lerna-and-yarn-with-pnpm-workspaces)
- [π How to set up monorepo build in GitLab CI](https://how-to.dev/how-to-set-up-monorepo-build-in-gitlab-ci)
- [π Why TurboRepo Will Be The First Big Trend of 2022](https://dev.to/swyx/why-turborepo-will-be-the-first-big-trend-of-2022-4gfj)
- [π Turborepo with Svelte](https://nenadkostic.com/blog/turborepo-sveltekit/)
- [π οΈ Monorepo.tools](https://monorepo.tools)
- [π οΈ Monorepo Workspace (VS Plugin)](https://marketplace.visualstudio.com/items?itemName=folke.vscode-monorepo-workspace)
- [β¨ Prisma + PNPM workspace Starter](https://github.com/millsp/prisma-pnpm-workspace)
- [β¨ Turborepo + Sveltekit Starter](https://github.com/Brisklemonade/turbosvelte)
- [β¨ Vidstack (Big Turborepo + Sveltekit Example)](https://github.com/vidstack/vidstack)
- [β¨ SvelteUI (Big Turborepo + Sveltekit Example)](https://github.com/svelteuidev/svelteui)
**Docs Starters**
- [β¨ Sveleton](https://github.com/Brisklemonade/sveleton)
- [β¨ KitDocs](https://github.com/svelteness/kit-docs)
- [β¨ Vitebook](https://github.com/vitebook/vitebook)
- [β¨ BooKit](https://bookit.leveluptutorials.com/)
**Blog Starters**
- [β¨ Hagura](https://github.com/sharu725/hagura-sveltekit)
**Tailwind UI**
- [β¨ Tailblocks](https://tailblocks.cc/)
- [β¨ HyperUI](https://www.hyperui.dev/)
**Svelte Themes**
- [β¨ Svelte Themes](https://www.sveltethemes.dev/)
**Full-Stack Sveltekit**
- [SVEMIX](https://www.svemix.com/)
# Thanks Everyone for your contributions!