Organisatie mappen gebruiker en programmeur

Twee voorbeelden voor het organiseren van de directories: één voor de “user” (gebruiker), die de software afhaalt, en één voor de “developer” (programmeur):

Gebruiker
Gebruiker van de software;
– Heeft icoon op desktop om programma te starten
– Heeft lokaal een script (dat door support wordt gebruikt):
– haalt de broncode ergens af.
– pakt die uit (indien nodig)
– compileert en maakt uitvoerbaar programma met icoon+link desktop
– zet afgehaalde versie in archief

Daarvoor is een vaste directory structuur nodig, gemaakt met een script, bv makeGbUserDirs.sh
(bv geïnstalleerd en uitgevoerd door de admin, programmeur, ..)

#/bin/bash
echo "prepare local software directories"
mkdir ~/.systemPrograms
mkdir ~/.systemPrograms/log
mkdir ~/.systemPrograms/gb3src
mkdir ~/.systemPrograms/gb3src/old
mkdir ~/.systemPrograms/gb3prj
mkdir ~/.systemPrograms/gb3lib
mkdir ~/.systemPrograms/gb3run
mkdir ~/.systemPrograms/gb3run/previous
ls ~/.systemPrograms > ~/.systemPrograms/directoryCreated.txt

Nb: De programmeur kan op zijn eigen computer dezelfde struktuur gebruiken* om te testen, eventueel voor het gemak niet onzichtbaar gezet.
Dus ~/systemPrograms ipv ~/.systemPrograms), met punt kan hij dezelfde scripts als user gebruiken en vermijdt verwarring waar kans het grootst is.
* hoewel er gevaar is voor conflicten met instellingen (Settings) en libraries.

Vorige versie (met git directories etc):

#/bin/bash
echo "prepare local software directories"
mkdir ~/.systemPrograms
touch ~/.systemPrograms/directoryCreated.txt
#mkdir ~/.systemPrograms/gb3Git
#touch ~/.systemPrograms/gb3Git/Applications.txt
mkdir ~/.systemPrograms/gb3src
mkdir ~/.systemPrograms/gb3prj
mkdir ~/.systemPrograms/gb3run
#mkdir ~/.systemPrograms/gb3testrun
ls ~/.systemPrograms > ~/.systemPrograms/directoryCreated.txt

In Applications.txt houdt de admin bij over welke apps het gaat

In de bin directory van de gebruiker wordt het script gezet om een nieuwe software/versie te downloaden en te installeren voor gebruik.

Gebruiken van de software

  • afhalen
  • installeren/compileren
  • log installatie/versies

Afhalen
Eerste stap: afhalen van een server of in dit geval een NextCloud share:

bv: GetFromNextcloud.sh

#!/bin/bash
releasedir = ~/NextCloud/Shared/ShareKantoor/SwUpdates/release
myapp = $1-$2.tar.gz
echo "Get from nextcloud: " 
if [ $# -eq 0 ]; then
  echo "- No arguments provided; choose from: "
  ls -lFAh $releasedir/*.tar.gz
  echo "or download (manually if no fixed link) from shared nextcloud folder sharekantoor/swupdates/release or other source"
  exit 1
fi
# check right download dir name:
cp $releasedir/$myapp ~/Downloads/
ls ~/Downloads/$1*
echo "when all went well, ready to use install script instfromdownload.sh"

Gebruik: parameters voor naam programma en versie:

GetFromNextcloud mijnProgramma 0.3.12

Installeren
Tweede stap: installeren voor gebruik:

bv: InstallFromDownload.sh

#!/bin/bash
# install gambasapp.tar.gz from downloads directory
# upd 25/10/2022: define softsource as download dir
softsource="~/Downloads/Software"
echo "Use: $0 [myGb3App] (name, no extention) to install myGb3App.tar.gz from $softsource"
if [ $# -eq 0 ]; then
  echo "- No arguments provided; choose from: "
  ls -lFAh $softsource/*.tar.gz
  echo "or download (manually if no fixed link) from shared nextcloud folder sharekantoor/swupdates/release or other source"
  exit 1
fi
cd $softsource
ls -lFAh $1*
myapp = $1.tar.gz
echo "move and unpack $myapp"
cp myapp ~/.systemPrograms/gb3prj/
cd ~/.systemPrograms/gb3prj
tar -xzvf myapp
echo "compile install $myapp"
cd myapp
gb3c -a
gba3 -o ./../gb3run/$myapp.gambas
echo "cleanup .. "
mv ~/.systemPrograms/gb3src/$myapp /.systemPrograms/gb3src/previous/
mv /.systemPrograms/gb3prj/$myapp /.systemPrograms/gb3src/
ls -lFAh /.systemPrograms/gb3src/$myapp
ls -lFAh /.systemPrograms/gb3src/$myapp
rm ~/Downloads/Software/$myapp
ls ~/Downloads/Software/$myapp
echo "End install, ready to run $myapp"

Log
Derde stap (optioneel): laat ergens log achter
– minstens bv een touch log/myapp-date.txt

Andere versie, 22/11/2022:

#/bin/bash
sleeptime=5
releasedir=~/Nextcloud/Shared/ShareKantoor/SwUpdates/release
targetdir=~/.systemPrograms
echo "Script to install gambas3 app ($1) with version ($2) in $targetdir .." 
cd $targetdir/gb3prj
if [ -z "$1" ]
then
  echo "No application name to install"
  ls -lF $releasedir
  echo "Gambas3 app name? (basename eg: myLog) - exists in remote?"
  read targetbase
  if [ -z "$targetbase" ];
  then
    echo "no app name given - exit"
    exit 0
  fi
else
  targetbase=$1
fi
echo "target base is $targetbase"
if [ -z "$2" ]
then
  echo "Check previous $targetbase versions: "
  ls -lFAh $targetdir/gb3src/$targetbase*
  echo "Version? (eg 0.0.4) version no of $targetbase to download;"
  read targetversion
  if [ -z "$targetversion" ]
  then
    echo "no $targetbase version given - exit"
    exit 0
  fi 
else
  targetversion=$2
fi
echo "try to move older versions to old/ " 
mv $targetdir/gb3src/$targetbase* $targetdir/gb3src/old/
ls $targetdir/gb3src/old/
echo "target version is $targetversion"
targetsoft="$targetbase-$targetversion"
targetsource="$targetsoft.tar.gz"
echo "Get $targetsource to unpack, compile/install $targetsoft in ~$targetdir (or ctrl-c)....." 
#exit1
sleep 1
echo "copy .. "
cp $releasedir/$targetsource $targetdir/gb3prj
cd $targetdir/gb3prj
ls -lFAh $targetbase*
sleep $sleeptime
if [ ! -f $targetdir/gb3prj/$targetsource ]
then
    echo "Download not succeeded - exit"
    exit 0
fi
echo "unpacking.."
#exit 1
sleep $sleeptime
tar -xzvf $targetsource
cd $targetbase
ls -lFAh
sleep $sleeptime
echo "cleanup to source dir $targetdir/gb3src"
mv $targetdir/gb3prj/$targetsource $targetdir/gb3src
rm $targetdir/gb3run/$targetbase.log
echo "compile $targetsoft.. "
#sleep $sleeptime
gbc3 -a 2> $targetdir/gb3run/$targetbase.log
gba3 -o $targetdir/gb3run/$targetbase.gambas
cd ..
echo "done $targetbase"
ls -lFAh $targetdir/gb3run/$targetbase*
echo "Changes: (top) "
head -5 $targetdir/gb3prj/$targetbase/Changes.txt
echo "Errors: " 
cat $targetdir/gb3run/$targetbase.log

Programmeur

We gaan er van uit dat gewerkt wordt met git. Ook de programmeur heeft vaste directories, misschien op verschillende locaties (werk/huis/..)
Als hij vanop verschillende locaties werkt is ook hier een script handig, bv makeGbDevDirs.sh

mkdir ~/dev
mkdir ~/dev/gb3prj
mkdir ~/dev/gb3run
mkdir ~/dev/gb3src

cd ~
ls dev/

ps: In omgeving (op pc) waar ook development gebeurt in andere context kan een extra laagje nodig zijn:
mkdir /home/user/dev/context/gb3prj
(context, groupname voor projectgroep zoals in gitlab, bedrijfsnaam/organisatie/klant, of..)

src
Als voor de start van een git project vertrokken wordt van een source pakket (.tar.gz), kan dat in gb3src gezet worden.
Bij het afhalen van een nieuwe src shuift de vorige op naar src/previous, en die src/previous kan af en toe leeggemaakt worden.

prj
hieronder zitten alle projectdirectories, met daarin de git repository van het project; eigenlijk dus de Gambas projecten waaraan vanuit de IDE gewerkt wordt.
De stappen van de ontwikkeling vinden binnen git plaats; bv een “dev” tak, een “test” tak, en eens goedgekeurd, een “main” tak met de release versie.
De broncode wordt bijgehouden op de git server en op alle ontwikkelstations.

run
Bij compileren wordt het uitvoerbaar bestand hier gezet.
Bij het omschakelen tussen verschillende ontwikkeltakken (branches) kan het nodig zijn een extra run directory te hebben, bv run/dev en run/test en/of run/main.

Software publiceren
De programmeur kan een script hebben om een “release” te doen; een afgewerkte versie van zijn applicatie in de Nextcloud directory klaarzetten voor de gebruikers. Of nog eenvoudiger: hij kan van in de Gambas3 IDE (programmeeromgeving) een “make source file” maken met als bestemming de gemeenschappelijke Nextcloud map.

Settings probleem crasht programma

Mijn FMain crasht op het ophalen van settings (Projecteigenschappen component Settings: gb.settings).

Gambas 3.14.3 en Gambas 1.17.3.

Eigenaardig genoeg werken de settings wel in MMain en FAbout, enkel niet in FMain.

Foutmelding:

“Geen reeks in FMain:2288”

Vervelend dat de foutmeldingen vertaald zijn als je daarop wil zoeken op het web.

Ik veronderstel dat de Engelstalige iet zou zijn als “Not an array (23) “?

Wat verklaard wordt als:

You try to use the array operator [] on something that does not accept it.

Ik heb de schrijfwijze van de code gecheckt, die is ok en werkt elders wel.

Settings["Report/TitlesOn"] = mniReportTitles.Checked

Ik zoek nog uit wanneer het juist begonnen is, want vorige versies van het programma werkten wel en gebruikten ook de settings.
Ik heb ondertussen een nieuwe versie van een library gebruikt, en menu’s bijgemaakt waarvan ik de checked toestand in settings bewaar/eruit ophaal, en settings code gegenereerd met een ander programma, allemaal dingen om te checken dus.

Oplossing
Kies in plaats van “Run” (F5) voor “Compile” (F7), dan zie je de waarschuwingen (warnings).

Daar zie je:

Klasse FMain, Lijn 9, Klassenaam verborgen door globale declaratie: Settings

Dat is niet erg behulpzaam, maar in FMain.Form op lijn 22 gebeurt het:
{ Settings Menu
}

Er is dus in een menu iets dat de naam “Settings” heeft… en dat geeft een conflict met de Settings component.

In de IDE terug te vinden met de menu editor (form, rechtsklik, menu-editor) of CTRL-e
Daar blijkt het een spacer te zijn, een leeg menu item dat enkel dient om een onderverdeling te maken. Waarschijnlijk heeft die per vergissing de naam Settings gekregen, bv door per vergissing op een toetsencombinatie voor plakken te drukken als er nog “Settings” in de buffer zat.

Verander “Settings” in een meer menu-geralateerde naam, bv mniSpacer.

Hieraan zie je weer het belang van de naamgeving. Ik gebruik voor menu’s een verschillende naam voor de hoofd en de sublijnen:
mnuFile : voor het hoofdmenu, zichtbaar in de menubalk.
mniFileOpen : voor het submenu, onder File.

Raadsel opgelost, klaar.