collectfiles failes for pipeline / yUglify: The system cannot find the path specified

Issue

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?

Solution

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/

Answered By – Gabriël

Answer Checked By – Marilyn (AngularFixing Volunteer)

Leave a Reply

Your email address will not be published.