I've been using Python's Buildout for a while and I really like it. My company has a lot of systems developed in Perl and I'm wondering if there is something similar to either Python's Buildout or Ruby's RVM available for Perl. My goal is to be able to automate deployments, development environment setup, and manage dependencies.
I must admit I have heard today the first time about the software you named, but reading the introduction material there is a difference in purpose between Buildout and RVM. An equivalent of the former is Shipwright, of the latter – perlbrew.
Related
What are the best practices for deploying a Perl application? Assume that you are deploying onto a vanilla box with little CPAN module installation. What are the ideal build, deploy methods? Module::Build, ExtUtils::MakeMaker, other? I am looking for some best practice ideas from those who have done this repeatedly for large scale applications.
The application is deploying onto a server. It's not CPAN or a script. It's actually a PSGI web application. That is, a ton of Perl packages.
I currently have a deployment script that uses Net::SSH::Expect to SSH into new servers, install some tools and configure the server, then pull down the desired application branch from source control. This feels right, but is this best practice?
The next step is building the application. What are the best practices for tracking and managing dependencies, installing those dependencies from CPAN, and ensuring the application is ready to run?
Thanks
The company that I work at currently build RPMs for each and every CPAN & Internal dependency of an application (quite a lot of packages!) that install into the system site_perl directory. This has a number of problems:
It is time consuming to keep building RPMs as versions get bumped across the CPAN.
Tying yourself to the system perl means that you are at the mercy of your distribution to make or break your perl ( in Centos 5 we have a max perl version of 5.8.8 ! ).
If you have multiple applications deployed to the same host, having a single perl library for all applications means that upgrading dependencies can be dangerous without retesting every application of the host. We deploy quite a lot of separate distributions all with varying degrees of maintenance attention, so this is a big deal for us.
We are moving away from building RPMs for every dependency and instead planning to use carton [1] to build a completely self contained perl library for every application we deploy. We're building these libraries into system packages, but you could just as easily tarball them up and manually copy them places if you don't want to deal with a package manager.
The problem with carton is that you'll need to setup an internal CPAN mirror that you can install your internal dependencies to if your application depends on modules that aren't on the CPAN. If you don't want to deal with that, you could always just manually install libs you need into local::lib [2] or perlbrew [3] and package the resulting libraries up for deployment to your production boxes.
With all of the prescribed solutions, be very careful of XS perl libs. You'll need to build your cartons/local:libs/perlbrews on the same architecture as the host you're deploying to and make sure your productions boxes have the same binary dependencies as what you used to build.
To answer the update to your question about whether it is best practice to source checkout and install onto you production host; I personally don't think that it is a good idea. The reasons why I believe that it is risky lays in the fact that it is hard to be completely sure that the set of libraries that you install exactly lines up to the libraries that you tested against, so deployments have the potential to be unpredictable. This issue can be exasperated by webapps as you are very likely to have the same code deployed to multiple production boxes that can get out of synch, also. While the perl community does a wonderful job of trying to release good quality code that is backwards compatible, when things go wrong it is normally quite an effort to figure things out. This is why carton is being developed, as this creates a cache of all the distribution tarballs that you need to install frozen at specific versions so that you can predictably deploy your code. All of that said though; if you are happy to accept that risk and fix things when they break then locally installing should be fine for you. However, at the very minimum I would strongly suggest installing to a local::lib so that you can back up the old local lib before installing updates so you have a rollback point if things get messed up.
Carton
local::lib
perlbrew
If it has some significant CPAN dependencies, then you might want to either write a small script that uses CPAN::Shell to install the necessary modules or edit the Makefile.PL of your application so that it reflects the necessary dependencies in the BUILD_REQUIRES portion of the file.
You may take a look at sparrowdo a perl6 configuration management tool, it comes with some handy plugins related to perl5 deployment, like installing cpan packages or deploying psgi application.
Update: this link https://dev.to/melezhik/deploying-perl5-application-by-sparrowdo-9mb could be useful.
Disclosure - I am the tool author.
I had developed web applications under environment mod_perl + Apache + Linux.
Now, I want to deploy a web application solution to my client, under Windows.
I was wondering any problem you guys encounter, when running mod_perl + Apache + Windows?
(1) Can I get Perl additional library (CPAN?), and being used in my web application easily? "Easily" means, no manual compilation. No complex configuration setup.
(2) How about Linux command feature? Perl integrate well with Linux utility to perform certain tasks. But if come to Windows, does it able to offer the similar features as in Linux's?
I am open to other web development environment under Windows (PHP or Python). The reason I choose Perl, as I know the language. I just do not want to switch to other language without a good reason.
I have not use mod_perl but for your question 1, you can take a look at the installation docs. . I have used Activestate Perl and PPM before and using ppm to install modules is easy.
for (2), Perl is a programming language and it comes with builtins and modules to do what *nix tools do, so there should be no problem. (there is no need to make calls to use *nix tools unless really necessary). Always check CPAN/PPM to see if there are modules to do what you want.
Personally, I prefer PHP if i am doing web programming because its easy to setup and lots of nice features already done specifically for web programming.
I am a web developer (J2EE application developer) and just want to expand what tools I use. I want to use Open Solaris for my personal projects. I have nothing against Linux and It looks like a lot of the same tools are on both systems.
Have you jumped to Solaris, was it a good experience?
DTrace, zones, switch between 32 bit and 64 bit mode with a single GRUB switch, ZFS, stable libraries (I can't really emphasize that one enough). Solaris 7 software generally runs on OpenSolaris, otherwise known as Solaris 11. glibc changes between minor kernel releases.
Xen is integrated pretty tightly, and setting up lx zones or virtualization to keep your Linux environment is dead simple.
OpenSolaris now has /usr/bin/gnu, where all you favorite utilities can be found.
Expect, though, to end up fighting the ./configure && make && make install cycle a little bit. A lot of developers assume you're running Linux, and don't prepend -m64 for Solaris, among other things. Compiling wxPython is an adventure, for instance.
Edit: I forgot to mention one (possibly important) thing to you. Package repositories aren't nearly comparable. It's neat that pkg image-update (equivalent to `apt-get update && apt-get upgrade && apt-get dist-upgrade) makes a ZFS snapshot that you can get back to via GRUB at any point, but you have nowhere near as many packages in IPS as apt. All the biggies are there, though.
If you're planning to switch, Sun's documentation is fantastic, and the BigAdmin tips of the day are worth reading for a while to get you up to speed.
For J2EE work per se, probably not much. As a more general developer you may appreciate DTrace. As an admin you'll love ZFS & zones. You'll hate the outdated utilities (mostly user-land) though. FreeBSD is a nice in-between Linux & Solaris though. :)
I guess the underlying OS doesn't matter much for a J2EE developer, as long as you stick to the java platform and don't make use of native libraries through JNI. Having said that, the most important factors to choose an OS would be cost and performance. Now, both Linux and OpenSolaris are open source and free to use, but I'm not sure about using OpenSolaris in commercial deployments. I also don't know how java performance differs from one to the other, but I'm strongly convinced that Sun's implementation for Linux is damn good.
Note: I've never used OpenSolaris and I use mostly Linux.
I'm not certain from your question if you mean for your development desktop or your hosting solution but I can take a crack at both. About six months ago I got hold of a free year of hosting on OpenSolaris running GlassFish. I hadn't used Solaris before and thought it would be a good learning experience. I built a test server, installed OpenSolaris and GlassFish, and used it to practice. It was very strightforward to configure GlassFish and deploy applications. Managing services in OpenSolaris is also simple once you read the right documentation. I like OpenSolaris and I like GlassFish.
Obviouly, I found similarities and differences from previous experience with Java application servers and operating systems. However, I thought so highly of the OS that I switched my desktop over last month. It has been a good experience.
Eclipse is not available on OpenSolaris, unfortunately. If you are an Eclipse user you would have to migrate to NetBeans.
The web shop where I work we do both .Net and PHP/Linux development. We'd like to start automating a lot more of our deployment processes using a common system that can be used for both. What would you recommend as a good common scripting language or automation system (like Ant or Maven) that works well for both .Net and Linux development?
I have no experience with Maven, but we've managed to get Ant to do everything we've wanted on multiple platforms, just by virtue of the fact that you can extend it with any Java program to do special tasks not included with the Ant application itself.
And then Java can, if necessary, call any external program you want to by using Runtime.exec(). Loses a bit of the portability but it was required for some command-line tools under both Linux and Windows.
You may want to see how Perl does cross platform automation. The design for Perl6, seems to be a bit better designed, but the Perl5 design has had many years to develop.
Perl has been ported to many different platforms, not just Linux and Windows.
You may get some mileage out of Capistrano. It is rails centric but it is pretty general purpose, and I believe it has been extended to do other things also. Not sure how well it plays with Windows and .NET, but worth a look.
You can develop .net on linux using Mono.
On that linux server you can use both .net and php.
Does anyone know of a good software development framework or similar that has the following properties?
Cross platform: it should be runnable on XP, Vista, OSX and common versions of Linux (such as Ubuntu and Kubuntu).
No installation: Be able to run the software from a USB stick without having to copy anything to the host machine.
Have good GUI support (this is why this question doesn't give a suitable answer, as far as I can tell).
Permissive licensing such as LGPL or BSD or such.
Among the softer requirements are having a set of abstractions for the most common backend functionality, such as sockets, file IO, and so on (There is usually some platform specific adaptations necessary), and supporting a good language such as Python or C++, though it is usually fun to learn a new one (i.e. not perl).
I think possible candidates are Qt 4.5 or above (but IFAIK Qt software will not run on Vista without any installation(?)), some wxWidgets or maybe wxPython solution, perhaps gtkmm. The examples I have found have failed on one or another of the requirements. This does not mean that no such examples exist, it just means that I have not found any. So I was wondering if anyone out there know of any existing solutions to this?
Some clarifications;
By "framework" I mean something like Qt or gtkmm or python with a widget package.
This is about being able to run the finished product on multiple platforms, from a stick, without installation, it is not about having a portable development environment.
It is not a boot stick.
It is ok to have to build the software specifically for the different targets, if necessary.
The use case I am seeing is that you have some software that you rely on (such as project planning, administration of information, analysis tools or similar) that:
does not rely on having an internet connection being available.
is run on different host machines where it is not really ok to install anything.
is moved by a user via a physical medium (such as a USB stick).
is run on different operating systems, such as Windows, Vista, Ubuntu, OSX.
works on the same data on these different hosts (the data can be stored on the host or on the stick).
is not really restricted in how big the bundled framework is (unless it is several gigabytes, which is not really realistic).
It is also ok to have parallel installations on the stick as long as the software behaves the same and can work on the same data when run on the different targets.
A different view on the use case would be that I have five newly installed machines with Vista, XP, OSX, Ubuntu and Kubuntu respectively in front of me. I would like to, without having to install anything new on the machines, be able to run the same software from a single USB stick (meeting the above GUI requirements and so on) on each of these five machines (though, if necessary from different bundles on the stick).
Is this possible?
Edit:
I have experimented a little with a Qt app that uses some widgets and a sqlite database. It was easy to get it to work on an ubuntu dist and on osx. For windows xp and vista I had to copy QtCored4.dll, QtGuid4.dll, QtSqld4.dll and mingwm10.dll to distribution directory (this was debug code) and I copied the qsqlited4.dll to a folder named "sqldrivers" in the distribution directory.
You mention wxWidgets but dismiss it as failing at least one of the requirements.
I don't know what your requirements are and in what way wxWidgets wouldn't work for you, but IMO it does fulfill them:
Cross platform: it should be runnable on XP, Vista, OSX and common versions of Linux.
It does run on those platforms, but "common versions of Linux" isn't good enough, as you can never be sure that the necessary GUI libraries for wxGTK (which should not be linked to statically) will be installed. This is however a problem for other solutions as well, unless you plan to put everything onto the stick.
No installation: Be able to run the software from a USB stick without having to copy anything to the host machine.
See the previous point, you would need to specify which libraries are needed on Linux. Also you could specify at build time not to use some of the system-provided libraries (for example for graphics, compression, regexes) but to use the wxWidgets-internal libraries instead.
Have good GUI support
Check.
Permissive licensing such as LGPL or BSD or such.
Check. You can statically link wxWidgets into your application too.
supporting a good language such as Python or C++
Supports both, and there are bindings to other languages as well.
having a set of abstractions for the most common backend functionality, such as sockets, file IO, and so on
It does have some abstractions like that, but you can link to other cross-platform libraries as well.
We use wxWidgets for FlameRobin, a graphical administration program for the Firebird SQL server. It has active ports to Windows, Linux and Mac OS X, and has been compiled for at least some BSD variant and Solaris as well. It definitely runs from a stick on Windows, I haven't tried with Linux or Mac OS X, but I don't see why it shouldn't there too.
Java.
It has GUI support.
It provides your network/file/etc. abstractions.
It is cross-platform. Most platforms you can think of have a JRE available.
No need to install a JRE. Most users probably already have one, and if not, you can run the appropriate JRE right off the stick.
You can provide several startup scripts for various platforms to run the app under the appropriate JRE.
Something else to consider is HTML+Javascript. :D
You can look at Mono it cross platform, has GUI (GTK+, or Winforms 2.0) and I can execute code without installing.
This might not be crossplatform, but is maybe even better, it dont even use the platform : linux on a stick :-)
The subtitle is
Take your Java workspaces wherever you go on a USB key
Here with java and eclipse, but nothing stops you there of course.
http://knol.google.com/k/inderjeet-singh/installing-a-ubuntu-hardy-heron-java/1j9pj7d01g86i/2#
Well, it depends on what you mean by 'package'. Kylix came close to being such a thing. It was QT based, and it allowed you to write once and compile for Windows + Linux. However, it was not an open source solution.
I asked a similar question in this link
http://www.24hsoftware.com/DevelopersForum/CrossPlatform-C-Library.html
and the best asnswer seems to be QT.
I have started using QT, but it is not as easy as I expected mainly due to deployment problems due to the DLL hell, Winsxs hell and manifest hell.
Tclkit is a single-file, self-contained Tcl/Tk system. The mac version I have is about 3.8 megs. You can get a version for just about any modern OS. I carry around a thumb drive that has mac, windows and linux binaries so I can run my scripts on any platform. No install is required, just copy one file wherever you want.
The most recent versions of tcklit use native, themed widgets (though, on *nix there really isn't a single "native" set of widgets...)