aantono / gradle-plugin-protobuf Goto Github PK
View Code? Open in Web Editor NEWProtobuf Plugin for Gradle has moved to
Home Page: https://github.com/google/protobuf-gradle-plugin
License: BSD 3-Clause "New" or "Revised" License
Protobuf Plugin for Gradle has moved to
Home Page: https://github.com/google/protobuf-gradle-plugin
License: BSD 3-Clause "New" or "Revised" License
plugin used is 'ws.antonov.gradle.plugins:gradle-plugin-protobuf:0.7'
The proto file looks like the following
message SegmentStatProtoResult {
required int64 aCount = 1;
required int64 tCount = 2;
required int64 cCount = 3;
required int64 iCount = 4;
optional string name = 5;
optional int32 status = 6;
message Stats {
required int32 nid = 1;
required int32 cid = 2;
required int64 cSize = 3;
}
repeated Stats stats = 7;
required int32 sNum = 8;
required int32 sDenom = 9;
required string dataset = 10;
}
See stack trace below.
11:59:13.388 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':generateProto'
11:59:13.390 [LIFECYCLE] [org.gradle.TaskExecutionLogger] :generateProto FAILED
11:59:13.462 [ERROR] [org.gradle.BuildExceptionReporter]
11:59:13.469 [ERROR] [org.gradle.BuildExceptionReporter] FAILURE: Build failed with an exception.
11:59:13.471 [ERROR] [org.gradle.BuildExceptionReporter]
11:59:13.472 [ERROR] [org.gradle.BuildExceptionReporter] * What went wrong:
11:59:13.481 [ERROR] [org.gradle.BuildExceptionReporter] Execution failed for task ':generateProto'.
11:59:13.495 [ERROR] [org.gradle.BuildExceptionReporter] > No signature of method: static org.gradle.util.CollectionUtils.join() is applicable for argument types: (java.lang.String, java.util.LinkedHashSet) values: [ -I, [/Users/felixgao/projects/git_bk_proto/src/main/proto, ...]]
11:59:13.496 [ERROR] [org.gradle.BuildExceptionReporter] Possible solutions: wait(), find(), notify(), any(), dump(), grep()
11:59:13.499 [ERROR] [org.gradle.BuildExceptionReporter]
11:59:13.548 [ERROR] [org.gradle.BuildExceptionReporter] * Exception is:
11:59:13.566 [ERROR] [org.gradle.BuildExceptionReporter] org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':generateProto'.
11:59:13.567 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:68)
11:59:13.567 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
11:59:13.573 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:34)
11:59:13.574 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.changedetection.CacheLockHandlingTaskExecuter$1.run(CacheLockHandlingTaskExecuter.java:34)
11:59:13.576 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.cache.internal.DefaultCacheAccess$3.create(DefaultCacheAccess.java:243)
11:59:13.577 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:188)
11:59:13.578 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:241)
11:59:13.579 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation(DefaultPersistentDirectoryStore.java:137)
11:59:13.580 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.changedetection.DefaultTaskArtifactStateCacheAccess.longRunningOperation(DefaultTaskArtifactStateCacheAccess.java:83)
11:59:13.581 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.changedetection.CacheLockHandlingTaskExecuter.execute(CacheLockHandlingTaskExecuter.java:32)
11:59:13.582 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:55)
11:59:13.583 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57)
11:59:13.596 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:41)
11:59:13.597 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
11:59:13.597 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:52)
11:59:13.598 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:42)
11:59:13.609 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:247)
11:59:13.610 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.executeTask(DefaultTaskPlanExecutor.java:52)
11:59:13.611 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.processTask(DefaultTaskPlanExecutor.java:38)
11:59:13.611 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:30)
11:59:13.612 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:83)
11:59:13.613 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)
11:59:13.614 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
11:59:13.614 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
11:59:13.615 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67)
11:59:13.616 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.changedetection.TaskCacheLockHandlingBuildExecuter$1.run(TaskCacheLockHandlingBuildExecuter.java:31)
11:59:13.617 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.cache.internal.DefaultCacheAccess$2.create(DefaultCacheAccess.java:118)
11:59:13.617 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:133)
11:59:13.618 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:116)
11:59:13.633 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:129)
11:59:13.633 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.changedetection.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:79)
11:59:13.635 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.changedetection.TaskCacheLockHandlingBuildExecuter.execute(TaskCacheLockHandlingBuildExecuter.java:29)
11:59:13.636 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
11:59:13.637 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
11:59:13.638 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67)
11:59:13.640 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
11:59:13.641 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
11:59:13.642 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54)
11:59:13.760 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:158)
11:59:13.760 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:113)
11:59:13.772 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:81)
11:59:13.773 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:38)
11:59:13.825 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.exec.InProcessGradleLauncherActionExecuter.execute(InProcessGradleLauncherActionExecuter.java:39)
11:59:13.826 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.exec.InProcessGradleLauncherActionExecuter.execute(InProcessGradleLauncherActionExecuter.java:25)
11:59:13.827 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:50)
11:59:13.837 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.cli.ActionAdapter.execute(ActionAdapter.java:30)
11:59:13.837 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.cli.ActionAdapter.execute(ActionAdapter.java:22)
11:59:13.838 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:200)
11:59:13.962 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:173)
11:59:13.963 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
11:59:13.968 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:138)
11:59:13.969 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
11:59:13.969 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
11:59:13.971 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.Main.doAction(Main.java:48)
11:59:13.972 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
11:59:13.973 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.Main.main(Main.java:39)
11:59:13.974 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:50)
11:59:13.974 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:32)
11:59:13.975 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.launcher.GradleMain.main(GradleMain.java:26)
11:59:13.976 [ERROR] [org.gradle.BuildExceptionReporter] Caused by: groovy.lang.MissingMethodException: No signature of method: static org.gradle.util.CollectionUtils.join() is applicable for argument types: (java.lang.String, java.util.LinkedHashSet) values: [ -I, [/Users/felixgao/projects/git_bk_proto/src/main/proto, ...]]
11:59:13.976 [ERROR] [org.gradle.BuildExceptionReporter] Possible solutions: wait(), find(), notify(), any(), dump(), grep()
11:59:13.977 [ERROR] [org.gradle.BuildExceptionReporter] at ws.antonov.gradle.plugins.protobuf.ProtobufCompile.compile(ProtobufCompile.groovy:33)
11:59:13.978 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:216)
11:59:13.978 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:122)
11:59:13.980 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:147)
11:59:13.981 [ERROR] [org.gradle.BuildExceptionReporter] at ws.antonov.gradle.plugins.protobuf.ProtobufCompile_Decorated.invokeMethod(Unknown Source)
11:59:13.982 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.util.ReflectionUtil.invoke(ReflectionUtil.groovy:23)
11:59:13.991 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$4.execute(AnnotationProcessingTaskFactory.java:161)
11:59:13.992 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$4.execute(AnnotationProcessingTaskFactory.java:156)
11:59:13.993 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:472)
11:59:13.994 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:461)
11:59:14.035 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:60)
11:59:14.038 [ERROR] [org.gradle.BuildExceptionReporter] ... 58 more
11:59:14.039 [ERROR] [org.gradle.BuildExceptionReporter]
11:59:14.040 [LIFECYCLE] [org.gradle.BuildResultLogger]
11:59:14.041 [LIFECYCLE] [org.gradle.BuildResultLogger] BUILD FAILED
Currently I don't see a way to get your plugin to create sources for C++ and Python, the other two built-in languages supported by protoc (--cpp_out, --python_out). Would be great to add support for those two options (unless I am missing something and one can force it via the plugin specification).
Is there a way to add a directory to the protoc's include path from my gradle.build file? I don't see a task that allows me to do this in the usage example. I have a .proto that assumes that a specific directory is in the protoc include paths when importing other proto files.
Plugin assumes proto files are contained in a directory called 'proto' under src/main. This is quite restrictive and other conventions are in active use E.g.
https://github.com/apache/hbase/tree/master/hbase-protocol/src/main/protobuf
To my understanding, the extracted-protos/{main,test} directories are only used to make protos from dependencies available to protoc. These protos were already compiled in the dependency projects, so the class files do already exist. It's therefore only necessary to compile the protos from the source directory, not thise from the extracted directory.
For example, let's say you have the following protos:
/project/src/main/proto/messages.proto
...
/project/src/test/proto/messages_test.proto
import "messages.proto";
...
For this to work, I need
dependencies {
testProtobuf fileTree("src/main/proto")
}
The plugin outputs the following Java files:
/project/build/generated-sources/main/Messages.java
/project/build/generated-sources/test/MessagesTest.java
/project/build/generated-sources/test/Messages.java
The latter file is redundant, and e.g. in Eclipse leads to errors being shown: "The type Messages is already defined"
When the referenced proto isn't from the same project, the freshly compiled class file will likely shadow the one from the library, which could lead to problems when the library version at runtime is different from the one at compile time.
The executed protoc
command should be changed as follows:
#instead of
protoc -Isrc/test/proto -Ibuild/extracted-protos/test --java_out=build/generated-sources/test src/test/proto/messages_test.proto build/extracted-protos/test/messages.proto
#use
protoc -Isrc/test/proto -Ibuild/extracted-protos/test --java_out=build/generated-sources/test src/test/proto/messages_test.proto
i.e., do not list the input files in extracted-protos
Are there any cases where it is usually necessary to compile protos in extracted-protos? Is it the right approach to list such protos as a dependency to the project being built?
Because of the way my protos are structured (in different directories with import statements assuming a specific path in the proto path parameter of the protoc command), I am getting duplicate proto errors when I try to use the plugin to compile my proto files. I believe because it is finding some protos in the directory specified in an import statement and in the local extractedProtosDir that the plugin creates.
Is there a way to tell the plugin to NOT copy the proto files specified in the dependencies into the extractedProtosDir? I've tried disabling the extractedProto task and the compile output shows that the extractedProto task is skipped while the generateProto task is run (shows as UP-TO-DATE), but no java files are actually generated. I'm not sure if this is because generateProto is dependent on extractedProto, but I've tried removing the dependency as well (using generateProto.dependsOn.remove("extractedProto")) with no success.
It would be great that if the extractedProtosDir is not specified that instead of using a default directory, it doesn't actually copy over the proto files at all.
I have two Android libraries, both of which have protos. ProjectB depends on ProjectA -- compile project(':projectA'). The only non-standard thing I've done is to disable nano protos and use the normal style protos (reverting that doesn't solve my problem).
Both protos can compile just fine when they're independent. However, if I add an import statement within protoB.proto to protoA.proto, I get an error:
protoA.proto: File not found.
protoB.proto: Import "protoA.proto" was not found or had errors.
I think this issue is similar to #22 but in my case, both projects are Android instead of plain Java. Should this work?
https://github.com/google/protobuf-gradle-plugin/blob/master/testProjectAndroid/build.gradle shows an Android app depending on protos defined in another Java project. If that works, shouldn't it still work when the other project is an Android project?
Should I move all protos into their own Java projects and have the Android projects depend on that instead?
Details:
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.1'
proto_library_version = '3.0.0-beta-1'
google_proto_library = "com.google.protobuf:protobuf-java:${proto_library_version}"
google_protoc_artifact = "com.google.protobuf:protoc:${proto_library_version}"
Hi,
Is it possible to extend the dependency functionality as described in issue 7 (#7) to cater for looking for dependencies within a repo. Our project publishes the protobuf definitions to our internal maven / artifactory repo. It would be good if I didn't have to download the dependencies to the local filesystem first before listing the downloaded dependencies.
i.e. it would be good if I could do the following
dependencies {
protobuf "com.test:dependent-jar:1.0.0"
}
instead of
dependencies {
protobuf files("lib/dependent-jar-1.0.0.jar")
}
Apologies if I can do this already.
Cheers!
I am getting this "error" message when running 0.9.1 of the plugin:
$ gradle build
You are using Gradle 2.1: This version of the protobuf plugin requires minimum Gradle version 1.12
:extractProto
:generateProto UP-TO-DATE
:compileJava UP-TO-DATE
:compileScala UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:extractTestProto
:generateTestProto UP-TO-DATE
:compileTestJava UP-TO-DATE
:compileTestScala UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE
BUILD SUCCESSFUL0.9.1
Total time: 3.668 secs
Say you have something like:
protobufCodeGenPlugins = ["my-plugin:$buildDir/some/path"]
If buildDir on Windows starts with C:, the command passed to protoc will be:
--plugin=protoc-gen-my-plugin=C
It seems that some it.split(":") should be it.split(":", 2) in order to avoid stripping the rest of the path, but I had trouble testing the change to confirm.
I have a next file structure:
app
- src
- main
- groovy
- proto-output
- proto-files
first.proto
then in my build.gradle
apply plugin: 'groovy'
apply plugin: 'protobuf'
version = '0.0.1'
group = 'com.example'
sourceCompatibility = 1.6
def appName = 'app'
ext {
groovyVersion = '2.3.6'
}
repositories {
mavenCentral()
}
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.3.6'
compile 'com.google.protobuf:protobuf-java:2.5.0'
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'ws.antonov.gradle.plugins:gradle-plugin-protobuf:0.9.1'
}
}
extractedProtosDir = "${projectDir}/src/main/proto-files"
generatedFileDir = "${projectDir}/src/main/groovy/ proto-output"
but when i do gradle build
i not see in proto-output
generated files, why?
Is it possible to specify fileTree(...)
or files(...)
to list dependencies?
Something like this:
dependencies {
protobuf fileTree(dir: 'deps/some_project/src/', include: '**/*.proto')
protobuf files('deps/some_project/src/**/*.proto')
}
It would be much better to just have the name 'protobuf'.
This plugin applies the java plugin witch is incompatible with the android new build system plugin (com.android.tools.build:gradle:0.6.3).
Is there any way make this plugin to make them compatible with andriod?
It appears that there are a couple of methods being used by this project that will be deprecated at some point in time. This is what gradle logs when building my source code:
The TaskContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead.
The ConfigurationContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.