Using Sass With Teams
Best practices for minimizing merge conflicts
Problem 1
Gem Version Conflicts
The Problem
- Ruby Gems are installed locally outside the code base
- Differing Ruby Gem versions will result in different CSS
- Trying to manage different Ruby Gems accross different projects will lead to huge headaches later
- It's difficult to get CI to build your Sass if the environment doesn't have the right Gem versions
The solution
Bundler provides a consistent environment for Ruby projects by tracking and installing the exact gems and versions that are needed.
Bundler is an exit from dependency hell, and ensures that the gems you need are present in development, staging, and production. Starting work on a project is as simple as 'bundle install'.
Install Bundler
$ sudo gem install bundler
Build a Gemfile...
source "https://rubygems.org"
gem 'sass', "3.2.9" #Exact version
gem 'sass-globbing', "~> 1.1.0" #Get maintenance releases 1.1.x
gem 'compass' #But compass 1.0.1 requires Sass 3.1.3!
gem 'breakpoint', ">= 2.0.5" #Greater than
gem 'singularitygs', "< 2.0.0" #Less than version
Even pull down from git...
Install the Bundle and Exec
$ bundle install
...
$ bundle exec compass watch
This will generate a Gemfile.lock file. Both the Gemfile and Gemfile.lock should be committed.
source 'https://rubygems.org'
group :development do
# Sass, Compass and extensions.
gem 'singularitygs', '~>1.2.0' # Alternative to the Susy grid framework.
gem 'singularity-extras', '~> 1.0.0.alpha.3'
gem 'breakpoint' # Manages CSS media queries.
gem 'sass','3.3.8' # Sass.
gem 'sass-globbing' # Import Sass files based on globbing pattern.
gem 'compass', '1.0.0.alpha.19' # Framework built on Sass.
gem 'compass-validator' # So you can `compass validate`.
gem 'compass-normalize' # Compass version of normalize.css.
gem 'toolkit' # Compass utility from the fabulous Snugug.
gem 'oily_png' # Faster Compass sprite generation.
gem 'css_parser' # Helps `compass stats` output statistics.
# Guard
gem 'guard' # Guard event handler.
gem 'guard-bundler' # Auto install/update bundle when needed.
gem 'guard-compass' # Compile on sass/scss change.
gem 'guard-shell' # Run shell commands.
gem 'guard-livereload' # Browser reload.
gem 'listen', '~> 1.1.0' # Listens to file mods & notifies you of changes.
gem 'yajl-ruby' # Faster JSON with LiveReload in the browser.
# Dependency to prevent polling. Setup for multiple OS environments.
# Optionally remove the lines not specific to your OS.
# https://github.com/guard/guard#efficient-filesystem-handling
gem 'rb-inotify', '~> 0.9', :require => false # Linux
gem 'rb-fsevent', :require => false # Mac OSX
gem 'rb-fchange', :require => false # Windows
end
Problem 2
Conflicting Line Comments
The Problem
- Sass line comments show full paths
- Every developer's path will be different
- Usually results in merge conflicts
- Makes diffing or creating patches a pain
We can't expect devs to turn off
line comments on every commit...
Two Solutions
- Have CI build your CSS on deployment
- Use Source Maps
Source Maps
- Available since Sass 3.3 and Compass 1.0.0.alpha.16
- Source maps abstract the CSS to Sass/SCSS mappings
- Works with your browser
- Allows you to ignore these debug mappings in VCS
- Now you can use and uglified CSS output format
Turn it on (if not already)
$ bundle exec compass compile
create css/classy_panel_styles.css
create css/classy_panel_styles.css.map
create css/team-elements.css
create css/team-elements.css.map
create css/team-no-query.css
create css/team-no-query.css.map
create css/team-styles.css
create css/team-styles.css.map
$ bundle exec sass style.scss:style.css --sourcemap
config.rb...
sourcemap = true
Real Live Example!
Problem 3
The Cache Buster
The Problem
- Using relative assets in Compass will result in URL's with a cache buster query on the end
- This query is based on the file's date
- Every dev will have a different file date resulting in a merge conflict
background:
#e9e9e9
url('../images/../../nfl_team_base/nfl_team_images/footer-nfl-divider.png?1407502479')
no-repeat
center
10px
;
The Solution
Just turn it off!
config.rb...
# Disable Cache Busting
asset_cache_buster :none
Questions?
Using Sass With Teams
By akoebbe
Using Sass With Teams
- 2,682