From f1553cc89612b93af7404812e17088a1ee6cec10 Mon Sep 17 00:00:00 2001 From: Grey-Echo Date: Thu, 30 Mar 2017 00:54:14 +0200 Subject: [PATCH] Work on the Beta_Test_Guide.md doc file. Around 2/3 done --- docs/Beta_Test_Guide.md | 77 ++++++++++++++++++++++++----- docs/Installation/GitHub_Clone.JPG | Bin 0 -> 29867 bytes 2 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 docs/Installation/GitHub_Clone.JPG diff --git a/docs/Beta_Test_Guide.md b/docs/Beta_Test_Guide.md index 62044db13..0aa8dd6d9 100644 --- a/docs/Beta_Test_Guide.md +++ b/docs/Beta_Test_Guide.md @@ -1,29 +1,61 @@ - *** UNDER CONSTRUCTION *** -## 2.2) Get your MOOSE repository installed on your PC and linked with GITHUB +You are interrested in testing the bleeding edge functionnalities and features added by the developers every day, and you are not afraid of bug that will inevitably crop up from time to time ? Then this page is for you ! You are going to learn : +1. How to set up your development environment +2. How is the Moose repository organized +3. How Moose is loaded in the missions and how this can make your workflow more efficient +4. How to use tools to process your .miz files efficiently +5. How Moose's release cycle work +6. How to report a bug -### 2.2.1) Install GITHUB desktop +This might be a bit daunting at first, but the rewards in term of simplified workflow and direct access to new features is well worth the effort! If you have any problem during the setup or at any other point, don't hesitate to ask the [community](Communities) for help! + +This guide assumes that you already setup your development environment, lust like a "normal" mission designer. Which means Lua Development Tools (LDT) is installed on your computer, and you already know how to create a mission using MOOSE. If it is not the case, please follow the instructions [here](http://flightcontrol-master.github.io/MOOSE/Usage_Guide.html). + +# 1) Installation + +## 1.1) Get your MOOSE repository installed on your PC and linked with GITHUB + +### 1.1.1) Install GITHUB desktop Install [GITHUB](https://desktop.github.com) desktop. -We use GITHUB desktop to sync the moose repository to your system. +Since the MOOSE code is evolving very rapidely between Releases, we store the MOOSE code on GitHub, and we use the GitHUb to sync it between the remote repository (the "origin") and your local MOOSE repository. That way, only one click is needed to update to the latest version of GitHub -### 2.1.1) Link the MOOSE repository +### 1.1.2) Link the MOOSE repository Link the MOOSE repository on GITHUB to your freshly installed GITHUB desktop. Do this by browing to the MOOSE repository at GITHUB, and select the green button **Clone or Download** -> **Open in Desktop**. +![](Installation/GitHub_Clone.jpg) Specify a local directory on your PC where you want to store the MOOSE repository contents. Sync the MOOSE repository to a defined local MOOSE directory on your PC using GITHUB desktop (press the sync button). +You now have a copy of the code on computer, which you can update at any time by simply pressing the sync button. -### 2.1.1) Sync the Dcs folder in the MOOSE repository +### 1.2) Install 7-Zip -On your local MOOSE directory, execute the batch file [DCS_Folder_Sync.bat](https://github.com/FlightControl-Master/MOOSE/blob/master/DCS_Folder_Sync.bat). -This will sync the dcs folder in the MOOSE repository from the submodule DCS API. -The Dcs folder is what we call a GITHUB submodule, which needs to be synced separately. -You will be notified when you need to re-sync the Dcs folder through GITHUB channels. +Install [7-Zip](http://www.7-zip.org/) if you don't already have it. It is a free and open source file archiver program. Since DCS' .miz files are simply renamed .zip files, 7-Zip is very usefull to manimulate them. We are providing the MOOSE testers and developpers tools to batch process their .miz files, and they rely on 7-Zip. Keep the path to your 7-Zip installation handy, it will be use in the next step ! -# 5) MOOSE Directory Structure +### 1.3) Run the Install script + +Because DCS is going to load Moose dynamically (more on that later), we need to do some (slightly) advanced stuff to finish the setup of your own development enviroment. Thankfully we wrote a program to do all of it automatically for you ! +Browse to your local MOOSE repository and run `Moose Development Environment Setup\MooseDevelopmentEnvironmentSetup.exe` **as an administrator** (Select the file > Left Click > Run as administrator). +* The Splash screen opens, click ok +* Enter (or browse for) the 3 paths asked and click ok. Don't worry about the trailing backslashs. +* Let the program do it's magic ! +* When the program finishes, it will inform you that you need to restart your computer to use the tools related to .miz files. + +If you encounter a problem during this installation, please contact the [community](Communities), with the mdes.log file which was generated next to the executable file. We'll try our best to help you! + +**Wait, I'm not running a program randomly found on the internet like that. I don't even know what it does, and why does it have to be run as an administartor anyway?!** +And you are right. But the explanation is a bit technical, your are warned! +The software will do the following: +* Create a hard link between your local repository and `DCSWorld/Scripts/` +* Add 7-Zip to your PATH environment variable (this explains the restart requirement) +* Copy a precompiled version of Lua 5.1 to your `Program Files` (this explains the administrator priviledge requirement) + +The script is made in AutoIt, it is available near the executable if you want to know what it does. If you are still reluctant, the whole process can be done manually by experienced users, get in touch with the [community](Communities)! + +# 2) MOOSE Directory Structure The MOOSE framework is devided into a couple of directories: @@ -31,3 +63,26 @@ The MOOSE framework is devided into a couple of directories: * Moose Mission Setup: Contains the Moose.lua file to be included in your scripts when using MOOSE classes (see below the point Mission Design with Moose). * Moose Test Missions: Contains a directory structure with Moose Test Missions and examples. In each directory, you will find a miz file and a lua file containing the main mission script. * Moose Training: Contains the documentation of Moose generated with luadoc from the Moose source code. The presentations used during the videos in my [youtube channel](https://www.youtube.com/channel/UCjrA9j5LQoWsG4SpS8i79Qg), are also to be found here. + +# 3) Static Loading vs Dynamic Loading + +## 3.1) Static Loading + +Moose static loading is what the "normal" mission designer uses. Simply put, there is a tool which concatenates every .lua file which constitutes Moose into just one: Moose.lua. This is the file which is loaded in Mission Editorr by the mission designer. +This process is very useful when you are using a stable Release of Moose which don't change often, because it is really easy to set up for the mission designer. It also allows him to release missions which are contained in their entirety in the .miz file. +But in a context in wich Moose changes sometimes multiple times a day, static loading would require the generation of a new Moose.lua each time, replace the old Moose.lua in the .miz file you are using to test your changes, and play the mission. Add to this process the fact that the Mission Editor doesn't like changes to the .miz file while the mission is open, so you would need to close and reopen the ME everytime, and this process becomes unworkable for both the tester and the developper. + +## 3.2) Dynamic Loading + +Enter Moose Dynamic loading. In this process, the Moose.lua you insert in your .miz file looks for every .lua which constitute Moose in `DCSWorld\Scripts`, and asks DCS to load them. This way, the latest changes to Moose's .lua files in `DCSWorld\Scripts` are automatically taken into account when you restart the mission, no need to fiddle around with the .miz file or to close the mission editor! +Now, there is still a problem left : you wouldn't want to have to copy the Moose's .lua files from your local repository to `DCSWorld\Scripts` everytime you retrieve a new version of Moose. The solution to this problem is a dynamic link! It is created by the Install Scipt (see above), and, simply put, makes sure that the folder `DCSWorld\Scripts\Moose` is always in sync with your local repository. That way, everytime you want to update to the next Moose, you simply sync your local repository with the remote with GitHub, and restart your mission ! +Note that if you want to release your missions to end users, you will need to make it use the static loading process. There is a tool to automate this task, read below. + +# 4) Tools to help you manage your .miz files + +# 5) The release cycle + +To ensure that the next Release of Moose is as bug-free and feature rich as possible, every developer respects a + +# 6) How to report a bug ? + diff --git a/docs/Installation/GitHub_Clone.JPG b/docs/Installation/GitHub_Clone.JPG new file mode 100644 index 0000000000000000000000000000000000000000..7ea187890abd055ee16373aa586f5574a1170d90 GIT binary patch literal 29867 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 NB0BDO0qC!Ze*y