Hola amigos.
En otro tema estaban comentando sobre el inconveniente que se presenta con las
dependencias de los programas cuando estos corren desde el IDE.
Bien, les propongo un poco de código que, espero, resuelva el problema para las distribuciones que gambas hace paquetes.
Aclaraciones
- La forma correcta de indicar las dependencias en en el momento de crear un paquete. Existe la opcion "Mismas dependencias para todos los paquetes" es decir si marcamos Archlinux y Ubuntu, se crearan paquetes para ambas distros y en ellos se especificaran las mismas dependencias pero no lo recomiendo porque en cada distro los paquetes pueden tener nombres diferentes o estar agrupados de otra manera o no existir.
- El código que les comparto trabaja en Manjaro y Archlinux, espero que para Ubuntu, derivados y otras distros también lo haga, en caso que no funcione, ya saben pasen el feedback.
- Ya saben que al crear paquetes hay distros para las que, desde el IDE, no podrán crearlos, como en mi caso, que uso Manjaro y no está habilitado el checkbox para ubuntu ni para debian.
- El código de abajo trabaja con el archivo .project que contiene la información sobre las dependencias, pero solo si crearon al menos una vez un paquete, de lo contrario no tiene esa información.
Código:
Private Function LoadExtras() As Integer
Dim cData As Collection
Dim sDistro As String
Dim sDep As String
Dim aDepDis As New String[]
Dim aDepGen As New String[]
Dim aDep As New String[]
Dim aPkg As New String[]
Dim aInstall As New String[]
Dim aMissing As New String[]
Dim x As Integer
Dim sTmp As String
Dim sPkg As String
Dim sCheck As String
Dim sExist As String
Dim sPakages As String
cData = Code.ProjInfo(".project")
aInstall.Clear
aMissing.Clear
sDistro = System.Distro()
sPakages = System.Packages()
For Each sDep In cData["ExtraDependencies"]
If InStr(sDep, sPakages & ":") > 0 Then
sTmp = Replace(sDep, sPakages & ":", "")
sTmp = Replace(sTmp, "\\n", ":")
aDepDis = Split(sTmp, ":")
Break
Endif
Next
' For Each sDep In cData["ExtraDependencies"]
' If InStr(sDep, Chr(42) & ":") > 0 Then
' sTmp = Replace(sDep, Chr(42) & ":", "")
' sTmp = Replace(sTmp, "\\n", ":")
' aDepGen = Split(sTmp, ":")
' Break
' Endif
' Next
For Each sDep In aDepDis
aDep.Add(sDep)
Next
For Each sDep In aDepGen
If aDep.Exist(sDep) = False Then
aDep.Add(sDep)
Endif
Next
For x = 0 To aDep.Max
aPkg.Add(Split(aDep[x], "\\")[0])
Next
If aPkg.Count > 0 Then
For Each sPkg In aPkg
sExist = ""
sCheck = ""
'¿Exist?
Select sDistro
Case "arch", "manjaro"
Shell "pacman -Ss " & sPkg & " 2>1" To sExist
Case "fedora"
Shell "yum search " & sPkg & " 2>1" To sExist
Case "debian", "ubuntu"
Shell "apt-cache search " & sPkg & " 2>1" To sExist
Case "opensuse", "suse"
Shell "zypper se " & sPkg & " 2>1" To sExist
Case "gentoo"
Shell "emerge -S " & sPkg & " 2>1" To sExist
Case Else
Message.Info(("Your system is not listed") & gb.NewLine & ("Please contact the developper to imform it"))
End Select
'¿Is installed?
Select sDistro
Case "arch", "manjaro"
Shell "pacman -Qs " & sPkg & " 2>1" To sCheck
Case "fedora", "redhat"
Shell "rpm -qa | grep " & sPkg & " 2>1" To sCheck
Case "debian", "ubuntu"
Shell "dpkg -l | grep " & sPkg & " 2>1" To sCheck
Case "opensuse", "suse"
Shell "zypper se -i " & sPkg & " 2>1" To sCheck
Case "gentoo"
Shell "emerge -pv " & sPkg & " 2>1" To sCheck
End Select
If Len(sExist) > 0 And Len(sCheck) = 0 Then
' The package exist in ditro but is not installed
aInstall.Add(sPkg)
Else
If Len(sExist) = 0 Then
' The package is missing in the ditro
aMissing.Add(sPkg)
Endif
Endif
Next
Endif
If aInstall.Count > 0 Then
Message.Info(("You You are using this program from the IDE") &
gb.NewLine &
("You must install these dependencies manually") &
":" & gb.NewLine & aInstall.Join("\n"))
Endif
If aMissing.Count > 0 Then
Message.Info(("The following packages do not exist") & "." &
gb.NewLine &
("Please contact to developper") & "." &
":" & gb.NewLine & aMissing.Join("\n"))
Endif
Return aInstall.Count
End
Saludos.
La siguiente función sera necesaria sPakages = System.Packages()
Código:
'' Shows the packages system according in tha Gambas way. (archlinux, debian, fedora, mageia, slackware, suse, ubuntu )
Public Function Packages() As String
Dim sVersion As String
Dim sBase As String
Dim oPkg As New Collection
Dim sPkg As String
oPkg.Add("fedora", "redhat-release") 'Redhat
oPkg.Add("fedora", "fedora-release")
oPkg.Add("mageia", "mageia-release")
oPkg.Add("slackware", "slackware-release")
oPkg.Add("archlinux", "arch-release") 'Arch *
oPkg.Add("archlinux", "manjaro-release") 'Manjaro
'oPkg.Add("emerge", "gentoo-release") 'Gentoo
oPkg.Add("suse", "SuSE-release") 'Susse
oPkg.Add("deian", "debian_version") 'Debian *
oPkg.Add("ubuntu", "os-release") 'Ubuntu ¿Esta correcto así?
'fedora ??
'
sBase = ""
For Each sBase In oPkg
If Exist("/etc/" & oPkg.Key) Then
sPkg = sBase
Break
Endif
Next
Return sBase
End
Saludos.