III- Aller plus Loin ?
Inception
Alors je vois déjà les petits malins qui se demandent si on peut faire des clones de clones. La réponse est PAS VRAIMENT. Il est techniquement possible de le faire mais tous les mods qui auront été ajoutés au premier clone seront intégralement recopiés dans le clone de deuxième niveau. Tous les Junction Points sont donc systématiquement liés à l’instance d’origine. Il serait techniquement possible de créer ces renvois manuellement en ligne de commande mais la gestion des mods via CKAN serait alors beaucoup plus délicate : une mise à jour d’un mod d’une instance inférieure ne serait pas prise en compte dans les répertoires ./CKAN de l’instance supérieure et celle-ci ne saurait donc pas que le mod a été mis à jour. Il faudrait le gérer manuellement. Peut-être que dans une version ultérieure cela sera rendu possible…
Néanmoins on peut imaginer une mise en œuvre de la sorte :
Niveau 1 (5,46Go) KSP1125STOCK | Niveau 2 (5,81Go) KSP_N1BaseGame | Niveau 3 Instances Utiles | Gains |
---|---|---|---|
KSP 1.12.5 Stock | Community Fixes MJ, KER, RCS Build Air TWP Forked Parallax, EVE, Scatterer Deferred, TUFX Restock & Restock+ Waterfall ZTheme (inclus Kopernicus) | (JNSQ) (KSRSS Main) (KSRSS Test Mods) | 22,54Go |
Mise en oeuvre
Comment procéder alors ? Il faudrait s’y prendre de la manière suivante :
- Préparer le niveau 2 avec les mods souhaités
- Cloner l’instance de niveau 2 pour créer le niveau 3
- Pour chaque répertoire dans GameData, le supprimer et le remplacer avec par un point de jonction avec la commande
mklink /J mod ..\..\KSP_ORIGIN\GameData\mod
Ce serait bien d’avoir un script prêt à l’emploi qui fasse ce travail à notre place, non ?
AVERTISSEMENT
Ce qui est décrit à la suite de cette notice est à utiliser à vos risques et périls. Je ne garantis ni la solidité du code ni l’intégrité de votre machine en cas de mauvaise utilisation de ces instructions. Je n’ai testé que chez moi.
Voici un exemple à placer dans le GameData de l’instance finale.
@echo off
setlocal enabledelayedexpansion
REM Ask the user to enter the name of a directory outside the current directory
REM no while loop possible in BAT, so using goto
:ask_root_folder
set "ROOT_FOLDER="
set /p ROOT_FOLDER="Please enter the source ROOT_FOLDER (outside this current folder): "
REM Check if ROOT_FOLDER exists and is not a subdirectory of the current directory
if not exist "!ROOT_FOLDER!" (
echo Folder "!ROOT_FOLDER!" does not exist. AGAIN.
goto ask_root_folder
)
REM Get the absolute path of the current directory
set "CURRENT_DIR=%cd%"
REM Check if ROOT_FOLDER is a subdirectory of the current directory
set "TEMP_ROOT=!ROOT_FOLDER:\=!"
set "TEMP_CUR=!CURRENT_DIR:\=!"
if /i "!TEMP_ROOT!"=="!TEMP_CUR!" (
echo Folder "!ROOT_FOLDER!" must be outside this current foler. AGAIN.
goto ask_root_folder
)
REM Save all directories in the current directory
set "FOLDERS="
REM Get list of junction names
(for /f %%j in ('dir /a:l /b') do echo %%j) > junctions.txt
REM Loop over all folders excluding junctions
for /d %%i in (*) do (
findstr /i /x "%%i" junctions.txt >nul
if errorlevel 1 (
REM Folder is NOT a junction
set "FOLDERS=!FOLDERS! %%i"
) else (
echo Skipping junction: %%i
)
)
REM Clean up
del junctions.txt
REM for each folder in current folder
for %%i in (!FOLDERS!) do (
set "I_FOLDER=%%i"
REM check whether ROOT_FOLDER\I_FOLDER exists
if exist "!ROOT_FOLDER!\!I_FOLDER!" (
REM Remove I_FOLDER from the current folder
rmdir /s /q "!I_FOLDER!
REM Create a junction point from I_FOLDER to ROOT_FOLDER\GameData\I_FOLDER
mklink /J "!I_FOLDER!" "!ROOT_FOLDER!\GameData\!I_FOLDER!
echo creating junction point: !I_FOLDER! -> !ROOT_FOLDER!\!I_FOLDER!
) else (
echo !ROOT_FOLDER!\!I_FOLDER!" does not exist. Next.
)
)
echo Finished.
pause
Besoin d’en savoir plus ? Vous pouvez contacter la communauté dans notre Discord !