A gulp library for salesforce and force.com development
npm install gulp-force-developer> A gulp library for salesforce and force.com development. Designed to help force.com developers to work using the benefits of gulp and a folder structure when developing.
See: (https://github.com/jkentjnr/sfdc-gulp-travisci-boilerplate) for a boilplate solution.
``shell`
npm install gulp-force-developer --save-dev
Once the plugin has been installed, it may be enabled inside your Gulpfile with this line of JavaScript:
`js`
var gulp = require('gulp'),
gutil = require('gulp-util');
forceDeveloper = require('./gulp-force-developer').registerForGulp(gulp, gutil);
Using gulp and the gulp-force-developer tasks, developers for salesforce & force.com can:
* Manage their projects / packages in any folder structure they like.
* Integrate the full suite of gulp tasks into their deployment process.
* Ensure only new & modified code is published as part of each deployment / build. This enables a developer to code using any IDE, pushing changes via gulp.
To use gulp-force-developer as quickly as possible, we recommend starting with the gulpfile.js in examples.
#### Traditional Folder Structure
Traditionally, when a developer is developing for salesforce / force.com, they are constrained by the mandated package structure. This structure is extremely limiting and, as the size of projects / packages grow, raplidly becomes unwieldy.
``
package.xml
== classes
-- PaymentController.cls
-- PaymentController.cls-meta.xml
-- UserManagement.cls
-- UserManagement.cls-meta.xml
== pages
-- Payment.page
-- Payment.page-meta.xml
-- UserManagement.page
-- UserManagement.page-meta.xml
== objects
-- Payment__c.object
#### gulp-force-developer Folder Structure
Using gulp-force-developer, a developer can adopt a fully dynamic file structure that operates independent of the prescribed salesforce package structure. The below example is a snippet from a developer managing their package in structure with little constraints, appropriate for their project.
``
== .metadata
-- Payment.page-meta.xml
-- PaymentController.cls-meta.xml
-- UserManagement.page-meta.xml
-- UserManagementController.cls-meta.xml
== Admin
== Users
-- UserManagementController.cls
-- UserManagement.page
== Payments
-- PaymentController.cls
-- Payment.page
-- Payment__c.object
To register the gulp tasks, you must use:
`js`
require('gulp-force-developer').registerForGulp(gulp, gutil);
#### force-package-config
Loads the options from the package.json
#### force-reset
Deletes the file used to track changes between force-commit calls
#### force-package
Packages files that have changed since the previous force-commit call
#### force-package-all
Packages all files
#### force-zip
Generates the output from the force-package and force-package-all calls as a zip, ready for deployment
#### force-commit
Updates the track changes file to refect the current state
#### force-mock-resources
Mocks resources from the package.json file. This is required when completing checkOnly tests that have Visualforce pages bound to resources.
To change your configuration, you may alter your project's package.json file.
`js`
{
"name": "salesforce project",
"version": "1.0.0",
"description": "",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "MIT",
"forceDeveloperConfig": {
"projectBaseDirectory": "src"
}
}
Or you may modify the options from within your gulpfile.
`js
var gulp = require('gulp'),
gutil = require('gulp-util'),
forceDeveloper = require('gulp-force-developer').registerForGulp(gulp, gutil);
forceDeveloper.options.projectBaseDirectory = 'src';
`
In your project's gulpfile, register the tasks with gulp and extend as appropriate.
`js
var salesforcePackageFile = './.package/package.zip',
username = 'testuser@force.com',
password ='password',
token = 'Qr1ScFquCn1uT0YO6ywUj5je';
// ----------------------------------------------------------------
var gulp = require('gulp'),
gutil = require('gulp-util'),
forceDeploy = require('gulp-jsforce-deploy');
forceDeveloper = require('gulp-force-developer').registerForGulp(gulp, gutil);
// ----------------------------------------------------------------
// REGISTER GULP TASKS
gulp.task('deploy', function(done) {
return gulp.src(salesforcePackageFile)
.pipe(forceDeploy({
username: username,
password: password + token,
pollInterval: 5*1000
//, loginUrl: 'https://test.salesforce.com'
//, pollTimeout: 120*1000
//, version: '33.0'
}));
});
gulp.task('default', gulp.series(
'force-package-config',
'force-package',
'force-zip',
'deploy',
'force-commit'
));
`
#### options.fileChangeHashFile
Type: String'.force-developer.filehash.json'
Default value:
Persists the file hashes to determine modified and new files.
#### options.forcePackageContinueSilent
Type: Booleanfalse
Default value:
By default force-package ends the gulp sequence with an error when no new or modified code is available for deployment. When forcePackageContinueSilent is true it causes force-package to continue with the subsequent gulp tasks. This behavior modification can be useful in complex deployment scenarios where multiple projects are merged together into one deployment.
#### options.metadataSourceDirectory
Type: String'app-metadata'
Default value:
The folder used to store all '-meta.xml' files for the project. A corresponding file is required for all pages, components, trigger and classes. If the projectBaseDirectory isn't altered, the default location is ./project/app-metadata.
#### options.projectBaseDirectory
Type: String'project'
Default value:
Used to determine the root of the project folder.
#### options.outputDirectory
Type: String'.package'
Default value:
The folder used when the files are copied from the project folder into a salesforce package-compliant folder structure.
#### options.outputPackageZip
Type: String'./.package/package.zip'
Default value:
The location where the zipped package is to be stored.
#### options.apiVersion
Type: Integer34
Default value:
The api version to be used by the library. Used when creating on-demand meta-xml files.
#### options.mockResources
Type: Array (String)[]`
Default value:
A list of resource names required to be mocked so a test deployment can be completed successfully.