Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to ignore node shebang error in Eclipse?

I am writing some node command line utilities. They all start with the line:

#!/usr/bin/env node

With Eclipse Juno and the Nodeclipse Node.js plugin, this line of code produces an error as shown:

Node shebang eclipse error

OK, so # is not a valid comment character in javascript, but it is a valid character in Linux/UNIX as the shebang of the first line in a file. But how can I set up Eclipse to ignore this error? This is a problem for me because code formatting does not work if you have errors. I have to delete the line. Hit CTRL-SHIFT-F and add the line back.

I have tried a lot of things and researched, but I can't find an answer.

There is a duplicate question out there, eclipse javascript syntax error on hashbang line, but my question has more info.

EDIT:

Looks like there was something added to jshint to allow shebangs in the first line. Maybe I need to update my node-eclipse, or maybe the node-eclipse project needs to update jshint?

  • My jshint eclipse integration is version 0.9.6.
  • My nodeclipse is 0.4.0.20130519...

I upgraded to

  • jshint eclipse integration 0.9.9.20131029
  • nodeclipse 0.7.0.20131101

That did not help.

Here is my JSHint version in eclipse:

enter image description here

EDIT 2:

Thanks for the answer VonC. But I think this shows that I do not have a BOM in the file. Any other ideas?

$ od -N 20 -t x1 hello.js
0000000 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 6e
0000020 6f 64 65 0a
0000024

EDIT 3:

With regard to Paul Verest's answer below, I tried to turn off JSDT validation, but I can't seem to do it. I unchecked "Enable JavaScript semantic validation" (In Eclipse, see Window > Preferences > JavaScript > Validator > Errors/Warnings), but the issue remains.

I am now uninstalling Eclipse Web Developer Tools 3.4.2. That did not seem to help and now my CSS and HTML editors are gone. Now I have tried to disable JSDT validation by following some of the ideas in this SO question, How do I remove javascript validation from my eclipse project?.

So I went into my project properties and went to JavaScript > Validation. I have set everything to "Enabled project specific settings" and unchecked "Errors/Warnings", "JSDOC", etc. Even so, I think validation is still running since the problem persists! My "Builders" Properties only lists the "JSHint Problem Checker" which is enabled. (I am doing all this on a new test project with a hello.js).

EDIT 4, THE ANSWER

It was not easy, but I ended up hacking the .project file in Eclipse. I had this:

<natures>
    <nature>org.nodeclipse.ui.NodeNature</nature>
    <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>

I removed the jsdt nature and now the error on the shebang line is GONE! I did this in my test project and my real project. It worked! This is actually pretty helpful since I can format the file and I'm actually running jshint now.

like image 435
Jess Avatar asked Sep 23 '13 13:09

Jess


2 Answers

There are 2 option for JavaScript validation in Eclipse:

  • JSDT
  • JSHint (default since Nodeclipse 0.7)

As configration is stored per project, copy .* settings files from project created with 0.7 or re-configure it manually (just compare .* files with newly created project). Then put .jshintrc file like https://github.com/Nodeclipse/nodeclipse-1/blob/master/org.nodeclipse.ui/templates/.jshintrc

Try to check JSHint options, if it is possible.

Note that with JSHint usage, ~~this question becomes general JSHint question (not Eclipse or Nodeclipse related).~~

UPDATE:

.project content since 0.7 :

<?xml version="1.0" encoding="UTF-8"?> <projectDescription>     <name>ProjectName</name>     <comment></comment>     <projects>     </projects>     <buildSpec>         <buildCommand>             <name>com.eclipsesource.jshint.ui.builder</name>             <arguments>             </arguments>         </buildCommand>     </buildSpec>     <natures>         <nature>org.nodeclipse.ui.NodeNature</nature>         <nature>org.eclipse.wst.jsdt.core.jsNature</nature>     </natures> </projectDescription> 

As @Jess discovered this was error shown by JSDT, not JSHInt, so removing <nature>org.eclipse.wst.jsdt.core.jsNature</nature> will stop JSDT from displaying it (even with JavaScript semantic validation already turned off since 0.7)

UPDATE 3:

Drawback of <nature>org.eclipse.wst.jsdt.core.jsNature</nature> removed will be that code assist and click-though to definition will not work (It actually works in rare cases when JSDocs are defined e.g. http://www.nodeclipse.org/nodejs/javascript/sources/books/2013/10/22/JSDT-require-JSDoc.html or within 1 .js file)

JSDoc support

Even click-through to definition click-through to definition

like image 105
Paul Verest Avatar answered Sep 30 '22 06:09

Paul Verest


Update:

The issue entered in nodeclipse points out to JSHint issue 66.
As Paul Verest remarks in his answer (upvoted), this could be as simple as making sure JSHint check the code.
Since commit 63da9, JSHint knows how to ignore that shebang directive.

// If the first line is a shebang (#!), remove it and move on.
// Shebangs are used by Node scripts.
if (lines[0] && lines[0].substr(0, 2) == '#!')
  lines.shift();

Original answer

Are you sure '#' is not a valid character (yet used in this question)?

Double-check the encoding of your node.js file, because if it is UTF-8 with BOM, then the javascript couldn't be launched properly.

See "What's different between utf-8 and utf-8 without BOM?", and the wikipedia article on shebang (section "Magic number")

The shebang characters are represented by the same two bytes in extended ASCII encodings, including UTF-8, which is commonly used for scripts and other text files on current Unix-like systems.
However, UTF-8 files may begin with the optional byte order mark (BOM); if the "exec" function specifically detects the bytes 0x23 0x21, then the presence of the BOM (0xEF 0xBB 0xBF) before the shebang will prevent the script interpreter from being executed.
Some authorities recommend against using the byte order mark in POSIX (Unix-like) scripts, for this reason and for wider interoperability and philosophical concerns.

like image 44
VonC Avatar answered Sep 30 '22 04:09

VonC