I've been trying to get django-pipeline to work to combine and minify my css and js assets. I don't seem to be able to sort the following issue out. When I run:
python manage.py collectstatic --noinput
I get an error:
pipeline.exceptions.CompressorError: The system cannot find the path specified.
Do I maybe need to install some additional packages? If so, how?
My settings for django-pipeline:
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'pipeline.finders.PipelineFinder',
)
PIPELINE_CSS = {
'testme': {
'source_filenames': {
'static/surveys/css/main.css',
},
'output_filename': 'css/testme.css',
},
}
PIPELINE_JS = {
'testmejs': {
'source_filenames': {
'surveys/js/gklib.js',
},
'output_filename': 'surveys/js/testmejs.css',
},
}
PIPELINE_ENABLED = True
This is the complete output:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\django\core\management\__init__.py", line 385, in execute_from_command_line
utility.execute()
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\django\core\management\__init__.py", line 377, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\django\core\management\base.py", line 288, in run_from_argv
self.execute(*args, **options.__dict__)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\django\core\management\base.py", line 338, in execute
output = self.handle(*args, **options)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\django\core\management\base.py", line 533, in handle
return self.handle_noargs(**options)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\django\contrib\staticfiles\management\commands\collectstatic.py", line 168, in handle_noargs
collected = self.collect()
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\django\contrib\staticfiles\management\commands\collectstatic.py", line 114, in collect
for original_path, processed_path, processed in processor:
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\pipeline\storage.py", line 36, in post_process
packager.pack_javascripts(package)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\pipeline\packager.py", line 112, in pack_javascripts
return self.pack(package, self.compressor.compress_js, js_compressed, templates=package.templates, **kwargs)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\pipeline\packager.py", line 106, in pack
content = compress(paths, **kwargs)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\pipeline\compressors\__init__.py", line 67, in compress_js
js = getattr(compressor(verbose=self.verbose), 'compress_js')(js)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\pipeline\compressors\yuglify.py", line 13, in compress_js
return self.compress_common(js, 'js', settings.PIPELINE_YUGLIFY_JS_ARGUMENTS)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\pipeline\compressors\yuglify.py", line 10, in compress_common
return self.execute_command(command, content)
File "d:\Development\django\TopDish\env_mrg_tacx_laptop\lib\site-packages\pipeline\compressors\__init__.py", line 240, in execute_command
raise CompressorError(stderr)
pipeline.exceptions.CompressorError: The system cannot find the path specified.
UPDATE
I've tried it again using another compressor:
PIPELINE_CSS_COMPRESSOR = 'pipeline.compressors.csstidy.CSSTidyCompressor'
This gives the exact same result, what could I be doing wrong?
UPDATE 2
If I set the compressors to None everything works, i.e. the files get combined and placed in the static files folder. They are also served correctly.
PIPELINE_CSS_COMPRESSOR = None
PIPELINE_JS_COMPRESSOR = None
So it must be something either in accessing or using the compressors. I'm running on Windows.
UPDATE 3
I've added some print() commands to init.py in /site-packages/pipeline/compressors/
class SubProcessCompressor(CompressorBase):
def execute_command(self, command, content):
import subprocess
print("Command: " + command)
The command is: /usr/bin/env/ yuglify --type=css --terminal Which can (probably?) never work on Windows.
I've then tried to deploy it to AWS Elastic Beanstalk, but I get an error then as well:
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
ERROR: [Instance: i-75dc5e91 Module: AWSEBAutoScalingGroup ConfigSet: null] Command failed on instance. Return code: 1 Output: [CMD-AppDeploy/AppDeployStage0/EbExtensionPostBuild] command failed with error code 1: Error occurred during build: Command 01_collectstatic failed.
INFO: Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
INFO: New application version was deployed to running EC2 instances.
ERROR: Update environment operation is complete, but with errors. For more information, see troubleshooting documentation.
ERROR: Update environment operation is complete, but with errors. For more information, see troubleshooting documentation.
I know it's possible to manually set the location of the compressors bin, but where to set it for Elastic Beanstalk?
Any suggestions how to sort this out?
I've fixed it by adding commands to the .ebextensions/app.config file:
# these commands run before the application and web server are
# set up and the application version file is extracted
commands:
01_node_install:
# run this command from /tmp directory
cwd: /tmp
# don't run the command if node is already installed (file /usr/bin/node exists)
test: '[ ! -f /usr/bin/node ] && echo "node not installed"'
# install from epel repository
# flag -y for no-interaction installation
command: 'yum install -y nodejs npm --enablerepo=epel'
command: 'npm -g install yuglify'
Based these commands on what I found on http://qpleple.com/install-nodejs-on-elastic-beanstalk/