The current lifecycle phases do not cleanly match steps necessary for building and deploying compiled languages (e.g. java).
dependencies: this seems to be about installing external dependencies on the machine ala npm. this is different than how gradle/maven work, such that binary artifacts are not installed until the actual compilation is run
compile: compile my java classes
test: compile & execute my test classes
deployment: deploy an artifact to a server
There is a problem here in that there is no clear place to actually package my artifacts for deployment. In my ideal scenario it would be:
compile: compile my application code
test: compile & execute test code
package: assemble my deployable artifacts (jar / war / ear etc.)
publish: publish the assembled artifact to a repository (artifactory, nexus, etc.)
deploy: deploy the artifact to a runtime server
otherwise i’m forced to sort of hide the packaging of the application as a post-test action, which certainly works, but is much less clear than accepting that packaging the application is meaningful phase in itself - in the scripting world this could be where minification etc. takes place as well.
also - the difference between publish and deploy is a meaningful one in my opinion, publishing is making the artifact available in a centralized repository vs. deploy which is deploying the running application on a server of some sort - these really are not the same thing