Giter Site home page Giter Site logo

carton's Introduction

NAME

Carton - Perl module dependency manager (aka Bundler for Perl)

SYNOPSIS

# On your development environment
> cat cpanfile
requires 'Plack', '0.9980';
requires 'Starman', '0.2000';

> carton install
> git add cpanfile cpanfile.snapshot
> git commit -m "add Plack and Starman"

# Other developer's machine, or on a deployment box
> carton install
> carton exec starman -p 8080 myapp.psgi

# carton exec is optional
> perl -Ilocal/lib/perl5 local/bin/starman -p 8080 myapp.psgi
> PERL5LIB=/path/to/local/lib/perl5 /path/to/local/bin/starman -p 8080 myapp.psgi

AVAILABILITY

Carton only works with perl installation with the complete set of core modules. If you use perl installed by a vendor package with modules stripped from core, Carton is not expected to work correctly.

Also, Carton requires you to run your command/application with carton exec command or to include the local/lib/perl5 directory in your Perl library search path (using PERL5LIB, -I, or lib).

DESCRIPTION

carton is a command line tool to track the Perl module dependencies for your Perl application. Dependencies are declared using cpanfile format, and the managed dependencies are tracked in a cpanfile.snapshot file, which is meant to be version controlled, and the snapshot file allows other developers of your application will have the exact same versions of the modules.

For cpanfile syntax, see cpanfile documentation.

TUTORIAL

Initializing the environment

carton will use the local directory to install modules into. You're recommended to exclude these directories from the version control system.

> echo local/ >> .gitignore
> git add cpanfile cpanfile.snapshot
> git commit -m "Start using carton"

Tracking the dependencies

You can manage the dependencies of your application via cpanfile.

# cpanfile
requires 'Plack', '0.9980';
requires 'Starman', '0.2000';

And then you can install these dependencies via:

> carton install

The modules are installed into your local directory, and the dependencies tree and version information are analyzed and saved into cpanfile.snapshot in your directory.

Make sure you add cpanfile and cpanfile.snapshot to your version controlled repository and commit changes as you update dependencies. This will ensure that other developers on your app, as well as your deployment environment, use exactly the same versions of the modules you just installed.

> git add cpanfile cpanfile.snapshot
> git commit -m "Added Plack and Starman"

Specifying a CPAN distribution

You can pin a module resolution to a specific distribution using a combination of dist, mirror and url options in cpanfile.

# specific distribution on PAUSE
requires 'Plack', '== 0.9980',
  dist => 'MIYAGAWA/Plack-0.9980.tar.gz';

# local mirror (darkpan)
requires 'Plack', '== 0.9981',
  dist => 'MYCOMPANY/Plack-0.9981-p1.tar.gz',
  mirror => 'https://pause.local/';

# URL
requires 'Plack', '== 1.1000',
  url => 'https://pause.local/authors/id/M/MY/MYCOMPANY/Plack-1.1000.tar.gz';

Deploying your application

Once you've done installing all the dependencies, you can push your application directory to a remote machine (excluding local and .carton) and run the following command:

> carton install --deployment

This will look at the cpanfile.snapshot and install the exact same versions of the dependencies into local, and now your application is ready to run.

The --deployment flag makes sure that carton will only install modules and versions available in your snapshot, and won't fallback to query for CPAN Meta DB for missing modules.

Bundling modules

carton can bundle all the tarballs for your dependencies into a directory so that you can even install dependencies that are not available on CPAN, such as internal distribution aka DarkPAN.

> carton bundle

will bundle these tarballs into vendor/cache directory, and

> carton install --cached

will install modules using this local cache. Combined with --deployment option, you can avoid querying for a database like CPAN Meta DB or downloading files from CPAN mirrors upon deployment time.

As of Carton v1.0.32, the bundle also includes a package index allowing you to simply use cpanm (which has a standalone version) instead of installing Carton on a remote machine.

> cpanm -L local --from "$PWD/vendor/cache" --installdeps --notest --quiet .

PERL VERSIONS

When you take a snapshot in one perl version and deploy on another (different) version, you might have troubles with core modules.

The simplest solution, which might not work for everybody, is to use the same version of perl in the development and deployment.

To enforce that, you're recommended to use plenv and .perl-version to lock perl versions in development.

You can also specify the minimum perl required in cpanfile:

requires 'perl', '5.16.3';

and carton (and cpanm) will give you errors when deployed on hosts with perl lower than the specified version.

COMMUNITY

AUTHOR

Tatsuhiko Miyagawa

COPYRIGHT

Tatsuhiko Miyagawa 2011-

LICENSE

This software is licensed under the same terms as Perl itself.

SEE ALSO

Carmel

cpanm

cpanfile

Bundler

pip

npm

perlrocks

only

carton's People

Contributors

dsteinbrunner avatar grinnz avatar hachi avatar hiroaki avatar kan avatar karenetheridge avatar masaki avatar mavit avatar melo avatar miyagawa avatar mschout avatar nihen avatar oalders avatar pplu avatar shibayu36 avatar wchristian avatar xdg avatar yanick avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

carton's Issues

Note: site_perl could mess with the bundled tree

because carton internally uses cpanm's -L which could in theory create a non-deterministic tree depending on what you have in site_perl in the local machine, bundle exec on the other machine might fail if one of the modules bundled have an implicit dependency to the modules that happen to be in site_perl.

This is rare, but could happen, and running carton exec, because it uses lib::core::only, would blow up. Turning off lib::core::only might be efficient in such cases, but it will just hide the problem than actually fixing it.

carton check gets caught in deep recursion and dies

Version 0.9.4:

$ carton check
Deep recursion on subroutine "Carton::_check_satisfies" at /home/rr/local/lib/perl5/Carton.pm line 442.
Deep recursion on subroutine "Carton::_check_satisfies" at /home/rr/local/lib/perl5/Carton.pm line 442.
Deep recursion on subroutine "Carton::_check_satisfies" at /home/rr/local/lib/perl5/Carton.pm line 442.
Killed

Support Strawberry Perl on Windows

I attempted to use carton with a working cpanm with Strawberry Perl on Windows. It failed with this error

carton install
Installing modules using Makefile.PL
'-' is not recognized as an internal or external command,
operable program or batch file.
Usage: cpanm [options] Module [...]

Try `cpanm --help` or `man cpanm` for more options.
Installing modules failed

Miyagawa on IRC says carton doesn't yet work with Windows.

I'm not much of a Perl hacker, but I'd like to help make carton work with at least Strawberry Perl. For Miyagawa: is it doable? If so, how much effort would be required?

uninstall should not remove deps in Makefile.PL

If you have

requires 'Plack';
requires 'Starman';

and run carton install, and then later deleting Starman will remove Plack as well, unless Plack is in the other dependencies tree. Because it is specified in Makefile.PL, it should not be deleted.

clarify exit code of `carton check`

Exit status of carton check seems to be 0 also if modules are missing. I'd expect exit status 0 only if all dependencies are satisfied. Anyway, the actual behavior of this command should be documented.

Easy way to define a specific version of a module

Right now the carton.lock is created automatically from Makefile.PL. The JSON format is more or less readable but not convenient (or meant) to edit. The following use case should be covered by carton:

You want a specific version of some module to be installed. How do you tell carton?

I ended up modifying carton.lock by hand, which is obviously not a best practice.

How about the following extension:

  • carton require Foo::Bar adds Foo::Bar to carton.lock, just as if it was specified as dependency in Makefile.PL.
  • carton require Foo::Bar 1.2 adds/modifies Foo::Bar version 1.2 or higher to carton.lock, just as if it was specified as dependency with version number in Makefile.PL.
    carton require Foo::Bar=1.2 adds/modifies Foo::Bar version 1.2 to carton.lock.

version check for cpanm

Some of the people installed standalone version of cpanm(e.g. perlbrew install-cpanm).
Old version of cpanm command doesn't interpret --showdeps option.
Then, old cpanm installs itself to local/ silently.
This behavior makes confusion for users. I seem carton need to check a version number of cpanm.

'v' prefixed module versions don't deploy

If a module's version is prefixed with 'v', eg. DBD::Pg, MooseX::Attribute::Chained, the initial install works. However, a later install for a deployment fails. cpanm does not recognize the given Module spec like "DBD::Pgv2.19.2". If the spec were "DBD::Pg2.19.2" it would work.

libintl-perl confuses carton

For example, see the following:

ollie@deimos ~ % mkdir tmp
ollie@deimos ~ % cd tmp
ollie@deimos ~/tmp % carton install Locale::TextDomain
Installing modules from the command line
Successfully installed libintl-perl-1.20
1 distribution installed
Complete! Modules were installed into local
ollie@deimos ~/tmp % rm -fr local 
ollie@deimos ~/tmp % carton install --deployment
Installing modules using carton.lock (deployment mode)
! Couldn't find module or a distribution libintl::perl (1.20)
Installing modules failed

carton install doesn't respect developer-release versions

It looks like carton always fetches distributions with production-release version, even if the one with developer-release version are required. In the following example, DBD::SQLite 1.35 is installed in the local directory (instead of DBD::SQLite 1.36_01).

use strict;
use warnings;
use ExtUtils::MakeMaker;

WriteMakefile(
    NAME => 'Foo',
    PREREQ_PM => {
        'DBD::SQLite' => '1.36_01',
    }
);

Will look at this at the hackathon (unless you fix this before that :)

Unable to find Net::FTP if dependency...

carton CPAN version: v0.9.4

If my make file had:

require 'Plack';

It would not install, because it couldn't find Net::FTP, adding

require 'Net::FTP';

before it made it work fine.

=== This is what was in the build.log ===

--> Working on LWP::UserAgent
Fetching http://cpan.metacpan.org/authors/id/G/GA/GAAS/libwww-perl-6.04.tar.gz
-> OK
Unpacking libwww-perl-6.04.tar.gz
Entering libwww-perl-6.04
Checking configure dependencies from META.yml
Checking if you have ExtUtils::MakeMaker 0 ... Yes (6.62)
Configuring libwww-perl-6.04
Running Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for LWP
Writing MYMETA.yml and MYMETA.json
-> OK
Checking dependencies from MYMETA.json ...
Checking if you have ExtUtils::MakeMaker 0 ... Yes (6.62)
Checking if you have URI::Escape 0 ... Yes (3.31)
Checking if you have LWP::MediaTypes 6 ... Yes (6.02)
Checking if you have Encode::Locale 0 ... Yes (1.03)
Checking if you have HTTP::Status 6 ... Yes (6.03)
Checking if you have HTTP::Negotiate 6 ... Yes (6.01)
Checking if you have File::Listing 6 ... Yes (6.04)
Checking if you have Encode 2.12 ... Yes (2.44)
Checking if you have Digest::MD5 0 ... Yes (2.51)
Checking if you have HTML::Entities 0 ... Yes (3.69)
Checking if you have HTTP::Daemon 6 ... Yes (6.01)
Checking if you have Net::HTTP 6 ... Yes (6.03)
Checking if you have URI 1.10 ... Yes (1.60)
Checking if you have Net::FTP 2.58 ... No
Checking if you have HTML::HeadParser 0 ... Yes (3.69)
Checking if you have HTTP::Cookies 6 ... Yes (6.01)
Checking if you have HTTP::Date 6 ... Yes (6.02)
Checking if you have HTTP::Request::Common 6 ... Yes (6.03)
Checking if you have MIME::Base64 2.1 ... Yes (3.13)
Checking if you have HTTP::Response 6 ... Yes (6.03)
Checking if you have IO::Select 0 ... Yes (1.17)
Checking if you have IO::Socket 0 ... Yes (1.31)
Checking if you have WWW::RobotRules 6 ... Yes (6.02)
Checking if you have HTTP::Request 6 ... Yes (6.00)
==> Found dependencies: Net::FTP
Searching Net::FTP on mirror index /Users/leo/git/photoweb/.carton/02packages.details.txt ...
Searching Net::FTP on mirror http://cpan.metacpan.org ...
Found Net::FTP version 1.22 < 2.58.
-> FAIL Finding Net::FTP (2.58) on mirror http://cpan.metacpan.org failed.
Searching Net::FTP on mirror http://backpan.perl.org ...
Downloading index file http://backpan.perl.org/modules/02packages.details.txt.gz ...
Found Net::FTP version 1.0607 < 2.58.
-> FAIL Finding Net::FTP (2.58) on mirror http://backpan.perl.org failed.
-> FAIL Couldn't find module or a distribution Net::FTP (2.58)
-> FAIL Bailing out the installation for libwww-perl-6.04. Retry with --prompt or --force.
-> FAIL Bailing out the installation for Plack-0.9986. Retry with --prompt or --force.
You have ExtUtils::MakeMaker (6.62)

carton.lock has invalid UTF-8

Generated a rather large carton.lock for a project and upon calling carton.lock elsewhere I'm seeing invalid utf-8 errors:

Can't parse carton.lock: malformed UTF-8 character in JSON string, at character offset 194627 (before "\x{1b29e0}Walter <jw...") at /home/bamboo/perl5/perlbrew/perls/perl-5.14.2-carton/lib/site_perl/5.14.2/Carton/Util.pm line 21.

Coming from Jörg Walter, the author of Crypt::GeneratePassword.

check command throws error

The latest version in cpan throws error on running

carton check

load_file() requires a valid, readable filename at /home/shared/perl5/lib/perl5/Carton.pm line 319

Carton fails to work correctly when paths have spaces

For example, see the following session:

ollie@deimos ~ % mkdir -p tmp
ollie@deimos ~ % cd tmp
ollie@deimos ~/tmp % mkdir -p a a\ 2
ollie@deimos ~/tmp % ls
a  a 2
ollie@deimos ~/tmp % cd a\ 2
ollie@deimos ~/tmp/a 2 % carton install aliased
zsh: correct 'carton' to 'cron' [nyae]? n
Installing modules from the command line
Successfully installed aliased-0.30
1 distribution installed
Complete! Modules were installed into local
ollie@deimos ~/tmp/a 2 % ls
carton.lock
ollie@deimos ~/tmp/a 2 % cd ..
ollie@deimos ~/tmp % ls a
lib
ollie@deimos ~/tmp % ls a/lib
perl5
ollie@deimos ~/tmp % find .
.
./a
./a/lib
./a/lib/perl5
./a/lib/perl5/i686-linux-thread-multi
./a/lib/perl5/i686-linux-thread-multi/auto
./a/lib/perl5/i686-linux-thread-multi/auto/aliased
./a/lib/perl5/i686-linux-thread-multi/auto/aliased/.packlist
./a/lib/perl5/i686-linux-thread-multi/.meta
./a/lib/perl5/i686-linux-thread-multi/.meta/aliased-0.30
./a/lib/perl5/i686-linux-thread-multi/.meta/aliased-0.30/install.json
./a/lib/perl5/i686-linux-thread-multi/.meta/aliased-0.30/MYMETA.json
./a/lib/perl5/aliased.pm
./a 2
./a 2/.carton
./a 2/carton.lock

Things have been installed into a, when they really should have gone into a 2/local

"carton install URI~1.51" does not work correctly

$ carton install URI~1.51
Installing modules from the command line
Successfully installed ExtUtils-MakeMaker-6.62 (upgraded from 6.30)
Successfully installed ExtUtils-Install-1.54 (upgraded from 1.33)
Successfully installed URI-1.60
3 distributions installed
Complete! Modules were installed into local

Is it cpanminus' issue?

carton install fails, then succeeds based on carton.lock file

Running Perl 5.10.1 and carton 0.9_7

It appears the way that the carton.lock file is written and parsed my expose dependency errors in packages in fatal ways. In this case it looks like some sort of dependency issue with Net::OAuth and/or it's dependencies that gets triggered by how the carton.lock file is written and then parsed on subsequent carton install runs.

cpanfile:

requires 'Net::OAuth';

Running carton install with no carton.lock file works. (Installs 40 modules for me)

However, taking the cpanfile and carton.lock file it creates to a new location, and carton install fails:

Installing modules using cpanfile
Successfully installed JSON-PP-2.27200
Successfully installed CPAN-Meta-YAML-0.008
Successfully installed Parse-CPAN-Meta-1.4404 (upgraded from 1.39)
Successfully installed version-0.9901 (upgraded from 0.77)
Successfully installed Module-Metadata-1.000011
Successfully installed CPAN-Meta-Requirements-2.122
Successfully installed CPAN-Meta-2.120921
Successfully installed Perl-OSType-1.002
Successfully installed ExtUtils-CBuilder-0.280205 (upgraded from 0.2602)
Successfully installed ExtUtils-ParseXS-3.18 (upgraded from 2.2002)
Successfully installed Module-Build-0.4003 (upgraded from 0.340201)
Successfully installed Sub-Uplevel-0.24
Successfully installed Test-Simple-0.98 (upgraded from 0.92)
Successfully installed Test-Pod-1.45
Successfully installed Tree-DAG_Node-1.09
Successfully installed Carp-1.26 (upgraded from 1.11)
Successfully installed Test-Warn-0.24
! Couldn't find module or a distribution URI::Escape (3.28)
Successfully installed Digest-SHA1-2.13
Successfully installed Class-Accessor-0.34
Successfully installed Digest-HMAC-1.03
Successfully installed LWP-MediaTypes-6.02
Successfully installed Encode-Locale-1.03
Successfully installed IO-HTML-0.04
Successfully installed URI-1.60
Successfully installed HTTP-Date-6.02
Successfully installed Compress-Raw-Bzip2-2.060 (upgraded from 2.020)
Successfully installed Compress-Raw-Zlib-2.060 (upgraded from 2.020)
Successfully installed IO-Compress-2.060 (upgraded from 2.020)
Successfully installed HTTP-Message-6.06
Successfully installed HTTP-Negotiate-6.01
Successfully installed File-Listing-6.04
Successfully installed HTML-Tagset-3.20
Successfully installed HTML-Parser-3.69
Successfully installed HTTP-Daemon-6.01
Successfully installed Net-HTTP-6.05
Successfully installed HTTP-Cookies-6.01
Successfully installed WWW-RobotRules-6.02
Successfully installed libwww-perl-6.04
Successfully installed Class-Data-Inheritable-0.08
! Bailing out the installation for Net-OAuth-0.28. Retry with --prompt or --force.
39 distributions installed
Installing modules failed

Running carton install again will then succeed:

Installing modules using cpanfile
Successfully installed Net-OAuth-0.28
1 distribution installed
Complete! Modules were installed into local

If I update the cpanfile to require URI first, the issue goes away:

requires 'URI';
requires 'Net::OAuth';

This will create a carton.lock file that will always succeed on carton install.

This may be related to Issue #55 as the behavior there looks similar...

Failure to install with Gearman::Worker dependency

Using carton v0.9.3 from CPAN.

If you have Gearman::Worker as a dependency, Cartoon fails to install.

Try this simple Makefile.PL:

use inc::Module::Install 0.91;

name 'Test';
abstract 'Test system';
author 'Pedro Melo <[email protected]>';
version '1.0';
license 'artistic';

# Specific dependencies
requires 'Gearman::Worker'                  => 0;

WriteAll;

The first time you run carton install, it works just fine and creates a proper carton.lock file. The second time you run carton install, Carton tries to install the Gearman module, but there is no such module.

carton fails to update dependencies when the versions in the carton.lock change

In this repository i've recorded the steps detailing how this error manifests: https://github.com/wchristian/carton-dep-fail-demonstration/network

In short: If i have version X of a module in my local dir and that module is a dependency of another module in the carton tree, then carton will not do anything if the version of that module is changed to X+1 in carton.lock and carton install is executed.

Looking at the code this seems to be because carton install only tries to install the modules identified by carton tree as non-dependency modules.

I'm not sure why this is, but it's a serious problem when a module my code uses directly is also a dependency of another module used by my code. Currently the only workaround is to delete the local directory and reinstall everything to make sure updates happen.

Downgraded modules do not show the right version in .lock

Because the way index builder works by scanning files out of ./local, it doesn't always pick the right version for the index. It should take cpanfile deps into account first, then use the recursive search to find the right version in ./local to freeze them.

cpanm: metadb is skipped if lock exists

if carton.lock exists we use it to run with --index option, that will automatically bypass the cpanmetadb, and ends up loading 02packages from cpantesters.

Catalyst fails to carton

Hi

Here is what I'm doing:

My Makefile.PL looks like this:

use inc::Module::Install;
name 'MyApp';
version '1.0';

requires 'Catalyst';

WriteAll;

then I run 'carton install'

I get this error:

load_file() requires a valid, readable filename at /home/dpatel/repo/Dynamite-deps/lib/perl5/Carton.pm line 320

It looks to me that Catalyst doesn't have a MYMETA.json file. This directory local/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Catalyst-Runtime-5.90004/ only contains an install.json.

Thanks

Dip

varying path separators in paths in carton.lock, problem or not?

I develop on windows and deploy on linux, which means that when i change the carton.lock file, the whole thing gets changed a lot, because doing so on windows results in \ separators, while on linux they all get replaced with / separators.

I'm not sure whether it's worth digging into and what the intended behavior is. Thoughts?

Ignores the version numbers in cpanfile

My cpanfile has only this record:

requires 'Mojolicious', '2.59';

But carton install Mojolicious 3.57 (the latest at this moment).

I'm use carton-v0.9_7.

--cached not working?

Hi

When I run this command:

carton install --cached

I get this

Unknown option: cached
Installing modules using Makefile.PL
Usage: cpanm [options] Module [...]

Try cpanm --help or man cpanm for more options.
Installing modules failed

I've got the latest versions of carton and cpanm.

i could be doing something wrong let me know if so.

Thanks

Dip

Carton fails to restore module instalation

Hi,

I'm trying to use Carton to manage modules on our environments. I created carton.lock file using carton --install. It was ok. Aftera that I tried to used carton --deployment to install modules on clean perl environment and it failed on a few modules. For instance, on Catalyst.

I tried to install it manually:

simoniki@antares:~/git/OCCE/perl$ carton install --path $HOME/perl5/perl5.16-common Catalyst
Installing modules from the command line
! Couldn't find module or a distribution ExtUtils::MakeMaker (6.6302)
! Bailing out the installation for Hash-MultiValue-0.12. Retry with --prompt or --force.
! Bailing out the installation for Plack-1.0006. Retry with --prompt or --force.
! Bailing out the installation for Plack-Test-ExternalServer-0.01. Retry with --prompt or --force.
! Bailing out the installation for Catalyst-Runtime-5.90016. Retry with --prompt or --force.
Installing modules failed

however, the ExtUtils::MakeMaker is already installed in proper version:

simoniki@antares:~/git/OCCE/perl$ perl -MExtUtils::MakeMaker -e 'warn $ExtUtils::MakeMaker::VERSION;'
6.6302 at -e line 1.

and

simoniki@antares:~/git/OCCE/perl$ carton install --path $HOME/perl5/perl5.16-common ExtUtils::MakeMaker
Installing modules from the command line
You have ExtUtils::MakeMaker (6.63_02)
Complete! Modules were installed into /home/simoniki/perl5/perl5.16-common

Installing Catalyst via cpanm works fine. It looks like Carton is somehow confused with version '6.63_02' and '6.6302'

I'm using Carton 0.9.4.

Is it bug in carton itself or there is something wrong in my environment?

Thanks,
Ivan

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.