a_real_hero
a_real_hero

Reputation: 37

Change Directory in Node REPL not working?

Just earlier, I posted my question: https://stackoverflow.com/questions/28336443/how-to-not-put-my-js-files-in-user-myuser-for-node-js

I have a file, hello.js, located in /Users/MyUser/Desktop/Node/

I can see that my default directory is /Users/MyUser/

Okay, so I get that I need to change my working directory. What I have been able to find so far is to use >process.chrdir('/Users/MyUser/Desktop/Node/');

Cool, that works, but now when I get out of the REPL shell, the directory resets.

The person who responded to my question said that I needed to run >node init and later npm install <name of dependency> --save

My first question: I have ran >node init and see that I can create this package.json file, what does this do exactly?

Secondly: I was told that I need to add dependancies. Could someone please explain to me what this means in Node terms? Does a dependancy simply mean a folder that I want node to include? Do I want to add this Node folder on my Desktop to be able to run my scripts?

I am currently trying to go through the learnyounode courses, however I do not want to have to save all of these test files in my /User/MyUser directory, so any advice would be greatly appreciated.

Thanks

Upvotes: 0

Views: 635

Answers (2)

nalinc
nalinc

Reputation: 7425

I have ran >node init and see that I can create this package.json file, what does this do exactly?

npm init is used to create a package.json file interactively. This will ask you a bunch of questions, and then write a package.json for you.

package.json is just a file that handle the project's dependencies and holds various metadata relevant to the project[ project description, version, license information etc]

I was told that I need to add dependencies. Could someone please explain to me what this means in Node terms?

Lets say you're building an application that is dependent on a number of NPM modules, you can specify them in your package.json file this way:

"dependencies": {
  "express": "2.3.12",
  "jade": ">= 0.0.1",
  "redis":   "0.6.0"
}

Now doing npm install would install a package, and any packages that it depends on.

A package is:

  1. a folder containing a program described by a package.json file
  2. a gzipped tarball containing (1)
  3. a url that resolves to (2)
  4. a @ that is published on the registry with (3)
  5. a @ that points to (4)
  6. a that has a "latest" tag satisfying (5)
  7. a that resolves to (2)

If you need to install a dependency that haven't been included in package.json, simply do npm install <packageName>. Whether or not you want to include this newly installed package in package.json is completely your take. You can also decide how this newly installed package shall appear in your package.json

    npm install <packageName> [--save|--save-dev|--save-optional]:  
      --save: Package will appear in your dependencies.
      --save-dev: Package will appear in your devDependencies.
      --save-optional: Package will appear in your optionalDependencies.

Does a dependency simply mean a folder that I want node to include?

Umm, partly yes. You may consider dependencies as folders, typically stored in node_modules directory.

Do I want to add this Node folder on my Desktop to be able to run my scripts?

No, node manages it all. npm install will automatically create node_modules directory and you can refer to those dependencies with require() in your .js files

var express = require('express');

Node REPL simply provides a way to interactively run JavaScript and see the results. It can be used for debugging, testing, or just trying things out. process.cwd() points to the directory from which REPL itself has been initiated. You may change it using process.chdir('/path'), but once you close the REPL session and restart, it would always re-instantiate process.cwd() to the directory from which it has been started.

If you are installing some packages/dependencies in node project1 and think those dependencies can also be useful for node project2,

  • install them again for project2 (to get independentnode_modules directory)
  • install them globally [using -g flag]. see this
  • reference packages in project2 as var referencedDependency = require('/home/User/project1/node_modules/<dependency>')

Simply doing process.chdir('/home/User/project1/node_modules/') in REPL and referencing as var referencedDependency = require('<dependency>') in your js file wont work.

>process.chdir('/Users/MyUser/Desktop/Node/'); change the working directory only for that particular REPL session.

Hope it helps!

Upvotes: 2

slebetman
slebetman

Reputation: 113974

This has nothing to do with node.js but is rather inherent in the design of Unix (which in turn influences the design of shells on other operating systems).

Processes inherit values from their parent's environment but their environments are distinct.

That terse description of how process environments work has a sometimes unexpected behavior: you cannot change your parent's environment. It was designed this way explicitly for security reasons.

What this means is, when you change the working directory in a process and quits that process your shell's working directory will not be affected. Indeed, your shell's working directory isn't affected even when the process (in this case, node REPL) is running.

This exact question is often asked by people writing shell scripts wanting to write a script that CDs into someplace. But it's also common to find this question asked by people writing other languages such as Perl, Tcl, Ruby etc. (even C).

The answer to this question is always the same regardless of language: it's not possible to CD from another program/script/process.

I'm not sure how Windows handles it so it may be possible to do it there. But it's not possible on Unixen.

Upvotes: 0

Related Questions