Erstellen Sie in einer Linux-Umgebung ein NuGet-Paket aus einem C # -Projekt und laden Sie es in ein anderes Projekt

Ich bin verantwortlich für Azure Functions kafka Extension, aber in letzter Zeit habe ich viele Pull-Anfragen, daher möchte ich E2E-Tests in anderen Sprachen als C # schreiben Es ist geworden. Die meisten Leute ändern Dinge, indem sie nur C # betrachten, aber funktioniert es aus meiner Sicht in anderen Sprachen? Es ist ärgerlich, jedes Mal zu testen, deshalb habe ich beschlossen, einen Mechanismus zu erstellen.

Herausforderungen beim Erstellen des aktuellen Pakets und beim Laden in ein Paket in einer anderen Sprache

Die ursprüngliche Erweiterung dieses Projekts wurde in C # geschrieben. Wenn Sie also das erstellte NuGet-Paket verwenden, scheint es, als würden andere Sprachen funktionieren. Daher ist Folgendes erforderlich.

Auf den ersten Blick sieht es nach nichts aus, aber es gibt einige Überlegungen

Immerhin war "100.100.100", nun, ich würde nicht so viel aktualisieren. Ich habe eine solche Version eingestellt und den Quellcode mit der einfachen Lösung identisch gemacht. Es scheint einen besseren zu geben.

Erstellen Sie ein C # -Paket

Unter der Annahme, dass dotnet bereits installiert ist, habe ich den folgenden Befehl auf WSL2 geschrieben und ausgeführt. Der wichtige Punkt ist "dotnet pack -o temp --include-symbole src / Microsoft.Azure.WebJobs.Extensions.Kafka / Microsoft.Azure.WebJobs.Extensions.Kafka.csproj / p: Version = 100.100.100` Package" Geben Sie die Version 100.100.100 an, führen Sie "pack" aus und geben Sie sie in das Verzeichnis "temp" aus. Danach wird es für jede Sprache in das Verzeichnis kopiert. Die Verzeichnisse für jede Sprache sind so konfiguriert, dass sie in "Docker" gepackt werden.

#!/bin/bash

CURRENT_DIR=`pwd`
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
cd $DIR/..

WORKING_DIR=temp
if [ -d "$WORKING_DIR" ]; then rm -rf $WORKING_DIR; fi

dotnet pack -o temp --include-symbols src/Microsoft.Azure.WebJobs.Extensions.Kafka/Microsoft.Azure.WebJobs.Extensions.Kafka.csproj /p:Version=100.100.100


PACKAGE_DIR=test/Microsoft.Azure.WebJobs.Extensions.Kafka.LangEndToEndTests/server/java8/packages
if [ -d "$PACKAGE_DIR" ]; then rm -rf $PACKAGE_DIR; fi
mkdir $PACKAGE_DIR
cp temp/* $PACKAGE_DIR

cd $CURRENT_DIR

Angabe der NuGet-Quelle

Wie kann ich die NuGet-Datei zum Lesen bringen? Ich dachte, ich habe "Local Source" eingestellt und zum Lesen gebracht. Derzeit gab es einen Befehl namens "dotnet nuget add source", also habe ich versucht, ihn zu verwenden. Die alte Information war, mono zu installieren und nuget.exe zu verwenden, aber jetzt scheint es unnötig.

RUN dotnet nuget add source /workspace/packages/

Übrigens aktualisiert die Ausgabe dieses Befehls die Standardeinstellung "NuGet.Config" wie folgt: Zuerst dachte ich darüber nach, die Methode zum Korrigieren der Version und die Priorität des Lesens der Nuget-Quelle so zu ändern, dass Local sie immer zuerst liest, aber schließlich ist False Positive besorgniserregend, also die Version zu korrigieren Ich habe es gemacht.

# pwd
/root/.nuget/NuGet
# cat NuGet.Config 
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  <add key="Package source 1" value="/workspace/packages/" />
</packageSources>

Java, Python-seitige csproj-Datei

Aufgrund der Spezifikation ist die csproj-Datei auf der Java- und Python-Seite nur die Version 100.100.100.100. Dies beinhaltet automatisch einen Build des aktuellen Quellcodes.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
	<WarningsAsErrors></WarningsAsErrors>
	<DefaultItemExcludes>**</DefaultItemExcludes>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Kafka" Version="100.100.100" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.1.7" />
  </ItemGroup>
  <ItemGroup>
    <None Update="confluent_cloud_cacert.pem">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

Dockerfile

Das endgültige Dockerfile sieht folgendermaßen aus: Einfach und chaotisch.

FROM mcr.microsoft.com/azure-functions/java:3.0-java8-core-tools

# Copy Local File
RUN mkdir /workspace
COPY . /workspace
WORKDIR /workspace
# dotnet 

ENV LD_LIBRARY_PATH=/workspace/target/azure-functions/kafka-function-20190419163130420/bin/runtimes/linux-x64/native

RUN dotnet nuget add source /workspace/packages/

RUN mvn clean package

ENTRYPOINT [ "/usr/bin/mvn", "azure-functions:run" ]

Zusammenfassung

Wenn Sie ein Meister von C # sind, können Sie sich einen besseren Weg vorstellen. Bitte lassen Sie mich wissen, wenn Sie welche haben. Danach konnte ich mit Docker-Compose den Kafka-Server starten und damit arbeiten. Danach schrieb ich das E2E-Framework in C # und integrierte es in Azure DevOps, und fertig.

Nachtrag 09.11.2020

Ich habe gute Ratschläge von Herrn Shibayan erhalten, deshalb habe ich mich für die Paketreferenz entschieden. Sie müssen kein lokales Nuget mehr erstellen, damit dieses besser aussieht. Ich dachte, ich könnte PackageReference nicht verwenden, weil ich es in Docker packe, aber es ist einfach und ich muss nur den Docker-Build-Kontext zum Projektstamm machen. Ich werde den Eintrag jedoch verlassen, da es ein gutes Lernen des Befehls war.

image.png

extension.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
	<WarningsAsErrors></WarningsAsErrors>
	<DefaultItemExcludes>**</DefaultItemExcludes>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.1.7" />
  </ItemGroup>
  <ItemGroup>
    <None Update="confluent_cloud_cacert.pem">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\..\..\..\src\Microsoft.Azure.WebJobs.Extensions.Kafka\Microsoft.Azure.WebJobs.Extensions.Kafka.csproj" />
  </ItemGroup>
</Project>

Dockerfile

FROM mcr.microsoft.com/azure-functions/java:3.0-java8-core-tools

# Copy Local File
RUN mkdir /workspace
COPY . /workspace
WORKDIR /workspace/test/Microsoft.Azure.WebJobs.Extensions.Kafka.LangEndToEndTests/server/java8
# dotnet 

ENV LD_LIBRARY_PATH=/workspace/target/azure-functions/kafka-function-20190419163130420/bin/runtimes/linux-x64/native

RUN mvn clean package

ENTRYPOINT [ "/usr/bin/mvn", "azure-functions:run" ]

docker build -t testj8 -f test/Microsoft.Azure.WebJobs.Extensions.Kafka.LangEndToEndTests/server/java8/Dockerfile . 

Resource

Recommended Posts

Erstellen Sie in einer Linux-Umgebung ein NuGet-Paket aus einem C # -Projekt und laden Sie es in ein anderes Projekt
Erstellen Sie eine Linux-Umgebung unter Windows 10
Erstellen Sie unter Windows eine anständige Shell- und Python-Umgebung
So stellen Sie pyenv unter Amazon Linux und Ubuntu ein, um eine Python 3.6.0-Umgebung zu erstellen
So richten Sie WSL2 unter Windows 10 ein und erstellen eine Lernumgebung für Linux-Befehle
Erstellen Sie eine VS Code + Docker-Entwicklungsumgebung mit Linux VM
[MariaDB] Installieren Sie MariaDB unter Linux und erstellen Sie eine Datenbank und einen Benutzer.
Bereiten Sie ein Projektformat für maschinelles Lernen vor und führen Sie es in SageMaker aus
Alles vom Erstellen einer Python-Umgebung bis zur Ausführung unter Windows
Erstellen Sie eine Python-Umgebung auf dem Mac (2017/4)
Erstellen Sie eine Python-Umgebung in Centos
Ich habe ein POST-Skript erstellt, um ein Problem in Github zu erstellen und es im Projekt zu registrieren
Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (5. Information Entropy)
Erstellen Sie Linux in einer Windows-Umgebung. Schritte zum Installieren und Migrieren von Laradock
Erstellen Sie eine Python-Umgebung auf Ihrem Mac
Erstellen Sie eine Deb-Datei aus einem Python-Paket
Erstellen Sie eine virtuelle Linux-Maschine unter Windows
So bereiten Sie mit pyenv-virtualenv unter Amazon Linux eine Umgebung mit unterschiedlichen Python-Versionen und -Paketen für jedes Projekt vor
Erstellen Sie ein Django-Projekt und eine Django-Anwendung in einer virtuellen Python-Umgebung und starten Sie den Server
Erstellen Sie ein C-Array aus einer Python> Excel-Tabelle
[Venv] Erstellen Sie eine virtuelle Python-Umgebung unter Ubuntu
Versuchen Sie, einen neuen Befehl unter Linux zu erstellen
Erstellen Sie eine Python-Ausführungsumgebung unter IBM i
Schritte zum schnellen Erstellen einer umfassenden Lernumgebung auf einem Mac mit TensorFlow und OpenCV
Memo Ein Anfänger hat versucht, eine Java-Umgebung zu erstellen und unter Ubuntu 18.04.2 LTS ins Japanische zu übersetzen.