Ceci est un article du Dart Advent Calendar 2019.
Ceci est un article sur l'interface native de Dart. Apprenez à utiliser les fonctionnalités de langage Go et C avec Dart. Nous avons également préparé une image Docker afin que vous puissiez essayer l'interface native tout de suite.
https://dart.dev/guides/libraries/c-interop
C'est une fonction qui vous permet d'utiliser une bibliothèque de langage C. Cependant, le langage C n'est pas fermé à la bibliothèque en langage C.
Les langages système tels que Go et Rust peuvent créer une bibliothèque partagée.
Vous pouvez également utiliser des fonctionnalités telles que Go et Rust dans Dart via cette bibliothèque partagée.
Dart est toujours à court de bibliothèques. Par conséquent, il est nécessaire d'utiliser une bibliothèque développée en langage C ou une bibliothèque développée en Go. L'interface native rend Dart plus pratique.
Nous avons inclus un éditeur appelé Code-Server qui exécute VSCode en ligne. Par conséquent, vous pouvez démarrer le développement immédiatement en démarrant Docker.
https://github.com/kyorohiro/my-code-server/tree/master/w/dart_and_go_and_c/
https://github.com/kyorohiro/advent-2019-code-server/tree/master/extra/dart_ffi_and_go_and_c
FROM ubuntu:20.04
WORKDIR /works
# install dart
RUN apt-get update
RUN apt-get install -y wget gnupg1
RUN apt-get install apt-transport-https
RUN sh -c 'wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -'
RUN sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list'
RUN apt-get update
RUN apt-get -y install dart
# install go
RUN apt-get install software-properties-common -y
#RUN add-apt-repository ppa:longsleep/golang-backports
RUN apt-get update
RUN apt-get install golang-go -y
RUN apt-get install git -y
RUN go get github.com/ramya-rao-a/go-outline
RUN go get github.com/mdempsky/gocode
RUN go get github.com/uudashr/gopkgs/cmd/gopkgs
RUN go get github.com/sqs/goreturns
RUN go get github.com/rogpeppe/godef
# install c
RUN apt-get install musl-dev -y
# code-server
RUN wget https://github.com/cdr/code-server/releases/download/2.1692-vsc1.39.2/code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz
RUN tar -xzf code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz -C ./ --strip-components 1
RUN /works/code-server --install-extension Dart-Code.dart-code
RUN /works/code-server --install-extension ms-vscode.go
RUN /works/code-server --install-extension ms-vscode.cpptools
WORKDIR /app
ENV PATH=${PATH}:/lib/dart/bin
ENV PATH="${PATH}:/root/.pub-cache/bin"
RUN pub global activate webdev
RUN pub global activate stagehand
CMD ["/works/code-server", "--auth","none", "--host","0.0.0.0","--port","8443", "/app"]
docker-compose.yml
version: '3'
services:
app:
build: ./app
ports:
- "8080:8080"
- "8443:8443"
volumes:
- ./app:/app
# - /var/run/docker.sock:/var/run/docker.sock
command: /works/code-server --auth none --host 0.0.0.0 --port 8443 /app
Plus précisément, consultez github.
$ git clone https://github.com/kyorohiro/advent-2019-code-server.git
$ cd advent-2019-code-server/extra/dart_fmi_and_go_and_c
$ docker-compose build
$ docker-compose up -d
Ouvrez http: //127.0.0.1: 8443 /
dans votre navigateur
Allez dans VSCode-> Fichier (Menu) -> / app / wgo
.
hello.go
package main
import "C"
import "fmt"
//export PrintHello
func PrintHello() {
fmt.Print("Hello,World")
}
func main() {}
La fonction PrintHello de Go sera appelée par Dart.
$ go build -o libhello.so -buildmode=c-shared hello.go
Cela créera les fichiers libhello.h
et libhello.so
.
Chargez-le à partir du langage C avant de le charger avec Dart.
main_hello.c
#include <stdio.h>
#include "libhello.h"
int main(int argc, char const *argv[])
{
PrintHello();
return 0;
}
Terminal
$ gcc -Wall -o main_hello.exe main_hello.c -L. -lhello
$ LD_LIBRARY_PATH=. ./main_hello.exe -L. -lhello
Hello,World
Oups !! Cela a bien fonctionné.
Allez dans VSCode-> Fichier (Menu) -> / app / wdart
.
bin/main.dart
import 'dart:ffi' as ffi;
typedef PrintHello_func = ffi.Void Function();
typedef PrintHello = void Function();
void main(List<String> arguments) {
var path = "/app/wgo/libhello.so";
ffi.DynamicLibrary dylib = ffi.DynamicLibrary.open(path);
final PrintHello hello = dylib
.lookup<ffi.NativeFunction<PrintHello_func>>('PrintHello')
.asFunction();
hello();
}
Terminal
$ dart ./bin/main.dart
Hello,World
PS
Nous avons également préparé un environnement en langage C. Vous pouvez le voir à partir du référentiel github plus tôt.
Vous pouvez profiter pleinement des fonctionnalités développées dans le langage Go avec Dart. Donc, de Dart, je peux presque tout faire. Avec le support de FMI, je pense qu'il est plus facile d'écrire des interfaces natives.
Si c'est pour le côté serveur, je pense que Docker Image etc. est pratique pour le développement.
À propos du serveur de code utilisé cette fois, dans l'Avent suivant L'explication est divisée en plus de 20 fois, donc si vous êtes intéressé, veuillez vous y référer.
https://qiita.com/advent-calendar/2019/code-server
Code
https://github.com/kyorohiro/my-code-server/tree/master/w/dart_and_go_and_c/
https://github.com/kyorohiro/advent-2019-code-server/tree/master/extra/dart_fmi_and_go_and_c