Dans un environnement Linux, créez un package NuGet à partir d'un projet C # et chargez-le dans un autre projet

Je suis en charge de Azure Functions kafka Extension, mais récemment, j'ai beaucoup de pull requests, donc je veux écrire des tests E2E dans des langues autres que C #. Il est devenu. La plupart des gens changent les choses simplement en regardant C #, mais de mon point de vue, cela fonctionne-t-il dans d'autres langages? C'est ennuyeux de tester à chaque fois, j'ai donc décidé de créer un mécanisme.

Défis lors de la construction du package actuel et de son chargement dans un package dans une autre langue

L'extension d'origine de ce projet a été écrite en C #. Ainsi, en utilisant le package NuGet créé, il semble que d'autres langages fonctionneront, donc ce qui suit est nécessaire.

À première vue, cela ne ressemble à rien, mais il y a quelques considérations

Après tout, ce qui s'est passé était «100.100.100», eh bien, je ne mettrais pas beaucoup à jour. J'ai défini une version comme celle-là et j'ai rendu le code source identique à la solution simple. Il semble y en avoir un meilleur.

Construire un package C

En supposant que dotnet est déjà installé, j'ai écrit et exécuté la commande suivante sur WSL2. Le point important est dotnet pack -o temp --include-symboles src / Microsoft.Azure.WebJobs.Extensions.Kafka / Microsoft.Azure.WebJobs.Extensions.Kafka.csproj / p: Version = 100.100.100 Package Spécifiez la version 100.100.100, exécutez pack et sortez dans le répertoire temp. Après cela, il est copié dans le répertoire de chaque langue. Les répertoires de chaque langue sont configurés pour être emballés dans Docker.

#!/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

Spécification de la source NuGet

Comment puis-je lire le fichier NuGet? J'ai pensé, j'ai mis «Source locale» et l'ai fait lire. Actuellement, il y avait une commande appelée dotnet nuget add source, alors j'ai essayé de l'utiliser. L'ancienne information consistait à installer mono et à utiliser nuget.exe, mais maintenant cela semble inutile.

RUN dotnet nuget add source /workspace/packages/

À propos, l'émission de cette commande met à jour la valeur par défaut NuGet.Config comme suit: Au début, j'ai pensé à changer la méthode de fixation de la version et la priorité de lecture de la source du nuget pour que Local le lise toujours en premier, mais après tout False Positive est inquiétant, donc corriger la version Je l'ai fait.

# 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, fichier csproj côté Python

En raison de la spécification, le fichier csproj côté Java et Python est uniquement la version «100.100.100.100». Cela inclura automatiquement une version du code source actuel.

<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

Le Dockerfile final ressemble à ceci: Facile et désordonné.

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" ]

Sommaire

Si vous êtes un maître de C #, vous pouvez penser à un meilleur moyen. S'il vous plaît laissez-moi savoir si vous en avez. Après cela, j'ai pu démarrer et travailler avec le serveur Kafka avec docker-compose, donc après cela, j'ai écrit le framework E2E en C # et l'ai intégré dans Azure DevOps, et j'ai terminé.

Supplément 09/11/2020

J'ai eu de bons conseils de M. Shibayan, alors j'ai décidé d'utiliser la référence du paquet. Vous n'avez plus besoin de faire un Nuget local, donc celui-ci est meilleur. Je pensais que je ne pouvais pas utiliser PackageReference parce que je l'empaquais dans Docker, mais c'est simple et j'ai juste besoin de faire du contexte de construction du docker la racine du projet. Cependant, je laisserai l'entrée car c'était un bon apprentissage de la commande.

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

Dans un environnement Linux, créez un package NuGet à partir d'un projet C # et chargez-le dans un autre projet
Créer un environnement Linux sur Windows 10
Créez un environnement shell et python décent sur Windows
Comment mettre Pyenv sur Amazon Linux et Ubuntu pour créer un environnement Python 3.6.0
Comment configurer WSL2 sur Windows 10 et créer un environnement d'étude pour les commandes Linux
Créer un environnement de développement VS Code + Docker avec une machine virtuelle Linux
[MariaDB] Installez MariaDB sous Linux et créez une base de données et un utilisateur opérationnel.
Préparez un format de projet d'apprentissage automatique et exécutez-le dans SageMaker
Tout, de la création d'un environnement Python à son exécution sous Windows
Créer un environnement Python sur Mac (2017/4)
Créer un environnement python dans centos
J'ai créé un script POST pour créer un problème sur Github et l'enregistrer dans le projet
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (5. Entropie des informations)
Construisez Linux sur un environnement Windows. Étapes pour installer Laradock et migrer
Créez un environnement python sur votre Mac
Créer un fichier deb à partir d'un package python
Créer une machine virtuelle Linux sous Windows
Comment préparer un environnement avec une version et un package Python différents pour chaque projet avec pyenv-virtualenv sur Amazon Linux
Créer un projet et une application Django dans un environnement virtuel Python et démarrer le serveur
Créer un tableau C à partir d'une feuille Python> Excel
[Venv] Créer un environnement virtuel python sur Ubuntu
Essayez de créer une nouvelle commande sous Linux
Créer un environnement d'exécution Python sur IBM i
Étapes pour créer rapidement un environnement d'apprentissage en profondeur sur Mac avec TensorFlow et OpenCV
Mémo Un débutant a essayé de créer un environnement Java et de le traduire en japonais sur Ubuntu 18.04.2 LTS.