GNU/Linux >> Linux Esercitazione >  >> Linux

Installazione di PowerShell Core su un Raspberry Pi (con tecnologia .NET Core)

All'inizio di questa settimana ho configurato .NET Core e Docker su un Raspberry Pi e ho scoperto che potevo eseguire il mio podcast sito web abbastanza facilmente su un Pi. Controlla quel post perché c'è molto da fare. Posso testare all'interno di un contenitore Linux e inviare i risultati del test all'host e quindi aprirli in VS. Ho anche esplorato un Dockerfile ragionevolmente complesso che è sia multiarcata che multistadio. Posso costruire e testare in modo affidabile il mio sito Web all'interno di un container o sul bare metal di Windows o Linux. Molto divertente.

Essendo principalmente uno sviluppatore Windows, ho molti file batch/cmd come "test.bat" o "dockerbuild.bat". Iniziano come piccoli pezzi di automazione usa e getta, ma man mano che il progetto diventa inevitabilmente più complesso.

Non mi interessa "vendere" nessuno PowerShell. Se ti piace bash, usa bash, è adorabile, così come lo sono gli script di shell. PowerShell è orientato agli oggetti nella sua pipeline, spostando elenchi di oggetti reali come output standard. Sono diversi e, soprattutto, possono vivere insieme. Proprio come potresti chiamare script Python da bash, puoi chiamare script PowerShell da bash o viceversa. Un altro strumento nei nostri toolkit.

PS /home/pi> Get-Process | Where-Object WorkingSet -gt 10MB

NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 10.92 890.87 917 917 docker-containe
0 0.00 35.64 1,140.29 449 449 dockerd
0 0.00 10.36 0.88 1272 037 light-locker
0 0.00 20.46 608.04 1245 037 lxpanel
0 0.00 69.06 32.30 3777 749 pwsh
0 0.00 31.60 107.74 647 647 Xorg
0 0.00 10.60 0.77 1279 037 zenity
0 0.00 10.52 0.77 1280 037 zenity

Gli script Bash e shell sono SUPER potenti. È un mondo intero. Ma è basato su testo (o json per alcune cose più recenti), quindi spesso pensi di più al testo.

pi@raspberrypidotnet:~ $ ps aux | sort -rn -k 5,6 | head -n6
root 449 0.5 3.8 956240 36500 ? Ssl May17 19:00 /usr/bin/dockerd -H fd://
root 917 0.4 1.1 910492 11180 ? Ssl May17 14:51 docker-containerd --config /var/run/docker/containerd/containerd.toml
root 647 0.0 3.4 155608 32360 tty7 Ssl+ May17 1:47 /usr/lib/xorg/Xorg :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
pi 1245 0.2 2.2 153132 20952 ? Sl May17 10:08 lxpanel --profile LXDE-pi
pi 1272 0.0 1.1 145928 10612 ? Sl May17 0:00 light-locker
pi 1279 0.0 1.1 145020 10856 ? Sl May17 0:00 zenity --warning --no-wrap --text

Puoi portarlo quanto vuoi. Per alcuni è potere intuitivo, per altri è barocco.

pi@raspberrypidotnet:~ $ ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }'
0.00 Mb COMMAND
161.14 Mb /usr/bin/dockerd -H fd://
124.20 Mb docker-containerd --config /var/run/docker/containerd/containerd.toml
78.23 Mb lxpanel --profile LXDE-pi
66.31 Mb /usr/lib/xorg/Xorg :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
61.66 Mb light-locker

Il punto è che c'è una scelta. Ecco un bell'articolo su PowerShell dal punto di vista di un utente Linux. Posso installare PowerShell sul mio Raspberry Pi (o su qualsiasi macchina Linux) e utilizzare gli stessi script in entrambi i posti? SI.

Per molti anni PowerShell è stato una cosa solo Windows che faceva parte dell'ecosistema chiuso di Windows. In effetti, ecco un video di me quasi 12 anni fa (lavoravo nel settore bancario) mentre parlo con Jeffrey Snover di PowerShell. Oggi, PowerShell è open source su https://github.com/PowerShell con molti documenti e script, anche open source. PowerShell è supportato su Windows, Mac e una mezza dozzina di Linux. Suona familiare? Questo perché è alimentato (ehm) da .NET Core multipiattaforma open source. Puoi ottenere PowerShell Core 6.0 qui su qualsiasi piattaforma.

Non vuoi installarlo? Avvialo in Docker in pochi secondi con

docker run -it microsoft/powershell

Dolce. Che ne dici di Raspbian sul mio Raspberry Pi basato su ARMv7? Stavo eseguendo Raspbian Jessie e PowerShell è supportato su Raspbian Stretch (più recente), quindi ho aggiornato da Jesse a Stretch (e ho riordinato e fatto il firmware mentre ci sono) con:

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ sudo sed -i 's/jessie/stretch/g' /etc/apt/sources.list
$ sudo sed -i 's/jessie/stretch/g' /etc/apt/sources.list.d/raspi.list
$ sudo apt-get update && sudo apt-get upgrade -y
$ sudo apt-get dist-upgrade -y
$ sudo rpi-update

Freddo. Ora sono su Raspbian Stretch sul mio Raspberry Pi 3. Installiamo PowerShell! Queste sono solo le istruzioni di base per iniziare. Dai un'occhiata a GitHub per informazioni avanzate e dettagliate in caso di problemi con i prerequisiti o i percorsi.

NOTA: Qui sto ottenendo PowerShell Core 6.0.2. Assicurati di controllare la pagina delle versioni per le versioni più recenti se stai leggendo questo in futuro. Ho anche usato 6.1.0 (in anteprima) con successo. La prossima anteprima 6.1 verrà aggiornata a .NET Core 2.1. Se stai solo valutando, ottieni l'anteprima più recente poiché conterrà le correzioni di bug più recenti.

$ sudo apt-get install libunwind8
$ wget https://github.com/PowerShell/PowerShell/releases/download/v6.0.2/powershell-6.0.2-linux-arm32.tar.gz
$ mkdir ~/powershell
$ tar -xvf ./powershell-6.0.2-linux-arm32.tar.gz -C ~/powershell
$ sudo ln -s ~/powershell/pwsh /usr/bin/pwsh
$ sudo ln -s ~/powershell/pwsh /usr/local/bin/powershell
$ powershell

Bello.

GOTCHA: Poiché ho aggiornato da Jessie a Stretch, mi sono imbattuto in un bug in cui libssl1.0.0 viene caricato su libssl1.0.2. Questo è un problema nativo complesso con l'interazione tra PowerShell e .NET Core 2,0 che è stato risolto. Solo le macchine aggiornate come la mente lo faranno, ma è facilmente risolvibile con sudo apt-get remove libssl1.0.0

Ora questo significa che i miei script di build PowerShell possono funzionare sia su Windows che su Linux. Questo è un esempio estremamente banale (solo una riga), ma nota "shebang" in alto che consente a Linux di sapere a cosa serve un file *.ps1. Ciò significa che posso continuare a usare bash/zsh/fish su Raspbian, ma ancora "build.ps1" o "test.ps1" su qualsiasi piattaforma.

#!/usr/local/bin/powershell
dotnet watch --project .\hanselminutes.core.tests test /p:CollectCoverage=true /p:CoverletOutputFormat=lcov /p:CoverletOutput=./lcov

Ecco alcuni esempi di PowerShell totalmente casuali ma adorabili:

PS /home/pi> Get-Date | Select-Object -Property * | ConvertTo-Json
{
"DisplayHint": 2,
"DateTime": "Sunday, May 20, 2018 5:55:35 AM",
"Date": "2018-05-20T00:00:00+00:00",
"Day": 20,
"DayOfWeek": 0,
"DayOfYear": 140,
"Hour": 5,
"Kind": 2,
"Millisecond": 502,
"Minute": 55,
"Month": 5,
"Second": 35,
"Ticks": 636623925355021162,
"TimeOfDay": {
"Ticks": 213355021162,
"Days": 0,
"Hours": 5,
"Milliseconds": 502,
"Minutes": 55,
"Seconds": 35,
"TotalDays": 0.24693868190046295,
"TotalHours": 5.9265283656111105,
"TotalMilliseconds": 21335502.1162,
"TotalMinutes": 355.59170193666665,
"TotalSeconds": 21335.502116199998
},
"Year": 2018
}

Puoi portare oggetti PowerShell da e verso Objects, Hashtables, JSON e così via

PS /home/pi> $hash | ConvertTo-Json
{
"Shape": "Square",
"Color": "Blue",
"Number": 1
}
PS /home/pi> $hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}
PS /home/pi> $hash

Name Value
---- -----
Shape Square
Color Blue
Number 1


PS /home/pi> $hash | ConvertTo-Json
{
"Shape": "Square",
"Color": "Blue",
"Number": 1
}

Eccone uno carino da MCPMag:

PS /home/pi> $URI = "https://query.yahooapis.com/v1/public/yql?q=select  * from weather.forecast where woeid in (select woeid from geo.places(1) where  text='{0}, {1}')&format=json&env=store://datatables.org/alltableswithkeys"  -f 'Omaha','NE'
PS /home/pi> $Data = Invoke-RestMethod -Uri $URI
PS /home/pi> $Data.query.results.channel.item.forecast|Format-Table

code date day high low text
---- ---- --- ---- --- ----
39 20 May 2018 Sun 62 56 Scattered Showers
30 21 May 2018 Mon 78 53 Partly Cloudy
30 22 May 2018 Tue 88 61 Partly Cloudy
4 23 May 2018 Wed 89 67 Thunderstorms
4 24 May 2018 Thu 91 68 Thunderstorms
4 25 May 2018 Fri 92 69 Thunderstorms
34 26 May 2018 Sat 89 68 Mostly Sunny
34 27 May 2018 Sun 85 65 Mostly Sunny
30 28 May 2018 Mon 85 63 Partly Cloudy
47 29 May 2018 Tue 82 63 Scattered Thunderstorms

O un one-liner se vuoi essere odioso.

PS /home/pi> (Invoke-RestMethod -Uri  "https://query.yahooapis.com/v1/public/yql?q=select  * from weather.forecast where woeid in (select woeid from geo.places(1) where  text='Omaha, NE')&format=json&env=store://datatables.org/alltableswithkeys").query.results.channel.item.forecast|Format-Table

Esempio: Questo non funzionerà su Linux poiché utilizza AIP specifici di Windows, ma se hai PowerShell sul tuo computer Windows, prova questo one-liner per una fantastica demo:

iex (New-Object Net.WebClient).DownloadString("http://bit.ly/e0Mw9w")

Pensieri?

Sponsor :Dai un'occhiata a JetBrains Rider:un IDE .NET multipiattaforma. Modifica, refactoring, verifica ed esegui il debug di applicazioni ASP.NET, .NET Framework, .NET Core, Xamarin o Unity. Scopri di più e scarica una versione di prova di 30 giorni!


Linux
  1. Visual Basic è supportato da .NET Core in Linux?

  2. Esecuzione di un'applicazione ASP.NET Core autonoma su Ubuntu

  3. Come scrivere un demone Linux con .Net Core

  4. NuGet per .NET Core in Linux

  5. .NET core X509Store su Linux

Installazione di Ubuntu MATE su un Raspberry Pi

.NET Core e Docker

Creazione, esecuzione e test di .NET Core e ASP.NET Core 2.1 in Docker su un Raspberry Pi (ARM32)

.NET e Docker

Pubblicazione di un sito Web ASP.NET Core su un host di macchine virtuali Linux economico

Come installare (.NET Core) Dotnet Core nelle distribuzioni Linux