109

I am using gulp-karma and facing a simple problem but cannot seems to find what i am doing wrong .

gulp.task('test', function (done) {
    karma.start({
        configFile: __dirname + '..\\test\\' +'\karma.conf.js',
        singleRun: true
    }, done);
});

Here is the code i am using and i cannot seems to go 1 level back in the folder directory . When i do the above it just append the ..\ to the folder direcotry without going 1 level back (which is the usual use of ..\). Following is the folder structure .

parent|
      test|karma.conf.js
      webapirole|gulpfile.js

and my folder is inside the webapirole folder . i want to go back 1 folder back and go inisde the test folder which contains the karma.conf.js file. can anyone make me understand what i am doing wrong here ?

error i am getting

[18:06:32] Starting 'tdd'...
ERROR [config]: File C:\Users\Documents\WebApiRole..\test\karma.conf.js does not exist
Tarun Kolla
  • 917
  • 1
  • 10
  • 30
Malik
  • 3,520
  • 7
  • 29
  • 42
  • possible duplicate of [How do i go to parent directory when using \_\_dirname?](http://stackoverflow.com/questions/30858775/how-do-i-go-to-parent-directory-when-using-dirname) – Malik Jun 17 '15 at 07:13

11 Answers11

122

TL;DR

Use path.join(__dirname, '..', 'test', 'karma.conf.js'). Prevent use of slashes.

Long Answer

As a lot of answers have pointed out, using path module is probably the best way. However, most of the solutions here have gone back to using slashes like:

path.join(__dirname+'../test/karma.conf.js')

However, by doing this, you're beating the purpose of using path. One uses path to do operations irrespective of the underlying OS (Linux, Windows etc). Just to give a bit of insight, you can do the path operations directly as string operations (like __dirname + '../test/karma.conf.js'. You do not do this because Linux uses forward slashes ( / ), Windows uses backward slashes ( \ ). This makes your application prone to errors when you port it across operating systems.

Thus, the better way would be:

path.join(__dirname, '..', 'test', 'karma.conf.js')

And of course, coming back - prevent use of slashes in your path.join, instead spread out your params.

Pranav Totla
  • 2,182
  • 2
  • 20
  • 28
70

I am using (path) NPM for the above usage......

simply require path npm in js file.Then use

let reqPath = path.join(__dirname, '../../../');//It goes three folders or directories back from given __dirname.
Atulkumar V. Jain
  • 5,102
  • 9
  • 44
  • 61
Vemula Abilash
  • 709
  • 5
  • 2
  • 1
    using slashes with the path module, defeats the purpose of using `path`. please see @Pranav Totla's answer below https://stackoverflow.com/a/61056875/14393584 – rishi Dec 27 '21 at 06:08
28

__dirname is just a string. you can use ../ to traverse up the folder structure and path.join to resolve the path

path = require('path')

configFile: path.join(__dirname, '../test/karma.conf.js'),
Vikash Anand
  • 435
  • 5
  • 8
11

You can use Path like this

const path = require('path'); 
path.join(__dirname, "../");
Hitesh Subnani
  • 589
  • 8
  • 11
9

if you are sending the path as a string,

configFile: path.join(__dirname+'../test/karma.conf.js'),

this doesn't work.

Instead you have to use a comma, (the plus sign concatenates the two strings)

configFile: path.join(__dirname, '../test/karma.conf.js'),
dilanSachi
  • 562
  • 6
  • 14
7

from Root directory

(path.join(__dirname , 'views' ,'main.html')) -> will return Root:/views/main.html

from any sub-folder of Root

(path.join(__dirname , '../views/main.html')) -> same as above
dan brown
  • 323
  • 5
  • 14
7

Like Pranav Totla said, hardcode the path with forward slashes ( "/" ) or backward slashes ( "\" ) makes the application prone to errors when it came across different operating systems.

Use the built in "path" module to prevent errors.

// Import "path"
const path = require('path');

// To go down on the three from index.html:
path.join(__dirname, 'css', 'style.css')

// To go up on the three from style.css:
path.join(__dirname, '..', 'img', 'cat.jpg')

// Three
root/
| |_css/
| |_img/
|
|_index.html
Zyncho
  • 407
  • 6
  • 12
5

we can use path module to go back one level from the current directory

Example:

path.join(__dirname, '..', 'test', 'conf.js')

__dirname -- present directory
..        -- one level
test      -- folder name
config.js -- file (test folder inside)
KARTHIKEYAN.A
  • 18,210
  • 6
  • 124
  • 133
3

Try putting a \\ before the ..\\.

Without it, the path your generating has a folder called WebApi... as part of it. You can see this in the path being output from the error message.

Like this:

gulp.task('test', function (done) { 
  karma.start({ configFile: __dirname + '\\..\\test\\' +'\karma.conf.js', singleRun: true }, done); 
});

You may also want to look into using the path library from npm. It makes combining paths a lot easier by handling adding and removing extra path separator characters as needed.

Jim Simon
  • 388
  • 2
  • 9
  • thank you for your response . however it didn't work out . this is the output i am getting for that `ERROR [config]: File C:\Users\Documents\WebApiRole\..\test\karma.conf.js does not exist!` as you can see it still considers ..\ as part of the path string – Malik Jun 15 '15 at 15:54
2

Here is all you need to know about relative file paths:

Starting with / returns to the root directory and starts there

Starting with ../ moves one directory backward and starts there

Starting with ../../ moves two directories backward and starts there (and so on...)

To move forward, just start with the first sub directory and keep moving forward.

suv1sh
  • 43
  • 1
  • 10
2

this will move you 2 directory back irrespective of any operating system:

import { join, sep } from 'path';
join(__dirname, sep, "..", sep, "..");
tmsbrndz
  • 1,297
  • 2
  • 9
  • 23