A principios de esta semana configuré .NET Core y Docker en una Raspberry Pi y descubrí que podía ejecutar mi podcast sitio web con bastante facilidad en un Pi. Revisa esa publicación ya que están sucediendo muchas cosas. Puedo probar dentro de un contenedor de Linux y enviar los resultados de la prueba al host y luego abrirlos en VS. También exploré un Dockerfile razonablemente complejo que es tanto de varias arquitecturas como de varias etapas. Puedo construir y probar mi sitio web de manera confiable dentro de un contenedor o en Windows o Linux. Muy divertido.
Como desarrollador principal de Windows, tengo muchos archivos por lotes/cmd como "test.bat" o "dockerbuild.bat". Comienzan como pequeños fragmentos de automatización desechables, pero a medida que el proyecto se vuelve inevitablemente más complejo.
No me interesa "vender" PowerShell a nadie. Si te gusta bash, usa bash, es encantador, al igual que los scripts de shell. PowerShell está orientado a objetos en su canalización, moviendo listas de objetos reales como salida estándar. Son diferentes y lo más importante, pueden vivir juntos. Al igual que puede llamar a los scripts de Python desde bash, puede llamar a los scripts de PowerShell desde bash, o viceversa. Otra herramienta en nuestros kits de herramientas.
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
Los scripts Bash y Shell son SUPER poderosos. Es todo un mundo. Pero está basado en texto (o json para algunas cosas más nuevas), por lo que a menudo piensas más en el texto.
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
Puedes llevarlo tan lejos como quieras. Para algunos es poder intuitivo, para otros es barroco.
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
El punto es que hay elección. Aquí hay un buen artículo sobre PowerShell desde la perspectiva de un usuario de Linux. ¿Puedo instalar PowerShell en mi Raspberry Pi (o cualquier máquina Linux) y usar los mismos scripts en ambos lugares? SÍ.
Durante muchos años, PowerShell fue algo exclusivo de Windows que formaba parte del ecosistema cerrado de Windows. De hecho, aquí hay un video mío hace casi 12 años (trabajaba en la banca) hablando con Jeffrey Snover sobre PowerShell. Hoy, PowerShell es de código abierto en https://github.com/PowerShell con muchos documentos y scripts, también de código abierto. PowerShell es compatible con Windows, Mac y media docena de Linux. ¿Suena familiar? Esto se debe a que funciona (ejem) con .NET Core de plataforma cruzada de código abierto. Puede obtener PowerShell Core 6.0 aquí en cualquier plataforma.
¿No quieres instalarlo? Inícielo en Docker en segundos con
docker run -it microsoft/powershell
Dulce. ¿Qué hay de Raspbian en mi Raspberry Pi basado en ARMv7? Estaba ejecutando Raspbian Jessie y PowerShell es compatible con Raspbian Stretch (más reciente), así que actualicé de Jesse a Stretch (y ordené e hice el firmware mientras lo hacía) 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
Enfriar. Ahora estoy en Raspbian Stretch en mi Raspberry Pi 3. ¡Vamos a instalar PowerShell! Estas son solo las instrucciones de inicio más básicas. Consulte GitHub para obtener información avanzada y detallada si tiene problemas con los requisitos previos o las rutas.
$ 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
Encantador.
ENTENDIDO: Debido a que actualicé de Jessie a Stretch, me encontré con un error en el que libssl1.0.0 se cargaba sobre libssl1.0.2. Este es un problema nativo complejo con la interacción entre PowerShell y .NET Core 2.0 que se está solucionando. Solo las máquinas actualizadas como mind lo harán, pero se soluciona fácilmente con sudo apt-get remove libssl1.0.0
Ahora bien, esto significa que mis scripts de compilación de PowerShell pueden funcionar tanto en Windows como en Linux. Este es un ejemplo profundamente trivial (solo una línea), pero tenga en cuenta el "shebang" en la parte superior que le permite a Linux saber para qué sirve un archivo * .ps1. Eso significa que puedo seguir usando bash/zsh/fish en Raspbian, pero aún "build.ps1" o "test.ps1" en cualquier plataforma.
#!/usr/local/bin/powershell
dotnet watch --project .\hanselminutes.core.tests test /p:CollectCoverage=true /p:CoverletOutputFormat=lcov /p:CoverletOutput=./lcov
Aquí hay algunos ejemplos de PowerShell totalmente aleatorios pero encantadores:
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
}
Puede llevar objetos de PowerShell hacia y desde Objetos, Hashtables, JSON, etc.
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
}
Aquí hay uno bueno de 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 una sola línea si quieres ser desagradable.
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
Ejemplo: Esto no funcionará en Linux, ya que usa AIP específicos de Windows, pero si tiene PowerShell en su máquina con Windows, pruebe este resumen para obtener una demostración genial:
iex (New-Object Net.WebClient).DownloadString("http://bit.ly/e0Mw9w")
¿Pensamientos?
Patrocinador :Consulte JetBrains Rider:un IDE .NET multiplataforma. Edite, refactorice, pruebe y depure aplicaciones ASP.NET, .NET Framework, .NET Core, Xamarin o Unity. Obtenga más información y descargue una versión de prueba de 30 días.