Prechádzať zdrojové kódy

Update npm and python setup

Introduced the top-level `npm run build:serverextension` command and cleaned up the python setup.py script to use it.

Fixes #20
Jason Grout 8 rokov pred
rodič
commit
b28728004c
4 zmenil súbory, kde vykonal 41 pridanie a 35 odobranie
  1. 19 6
      README.md
  2. 3 1
      jupyterlab/package.json
  3. 1 0
      package.json
  4. 18 28
      setup.py

+ 19 - 6
README.md

@@ -15,13 +15,15 @@ Jupyter Server Extension
 The Jupyter server extension source files are in the `jupyterlab/` subdirectory. To use this extension, you need the Jupyter notebook server version 4.2 or later.
 
 ### User installation
-```
+
+```bash
 pip install jupyterlab
 jupyter serverextension enable --py jupyterlab
 ```
 
 Start up Jupyterlab with the command:
-```
+
+```bash
 jupyter lab
 ```
 
@@ -29,9 +31,10 @@ Open a browser to the notebook server's URL (e.g., `http://localhost:8888`).
 
 
 ### Developer Installation
+
 You will need npm (preferably version 5 or later).
 
-```
+```bash
 git clone https://github.com/jupyter/jupyterlab.git
 cd jupyterlab
 npm install
@@ -40,15 +43,17 @@ jupyter serverextension enable --py jupyterlab
 ```
 
 Start up Jupyterlab with the command:
-```
+
+```bash
 jupyter lab
 ```
 
 Open a browser to the notebook server's URL (e.g., `http://localhost:8888`).
 
 When you make a change to JupyterLab npm package source files, run:
-```
-python setup.py jsdeps
+
+```bash
+npm run build:serverextension
 ```
 
 to build the changes and refresh your browser to see the changes.
@@ -78,11 +83,19 @@ npm run build
 ```
 
 **Rebuild**
+
 ```bash
 npm run clean
 npm run build
 ```
 
+### Build JupyterLab server extension
+
+```bash
+npm run build:serverextension
+```
+
+
 ### Run Tests
 
 Follow the source build instructions first.

+ 3 - 1
jupyterlab/package.json

@@ -23,7 +23,9 @@
   },
   "scripts": {
     "clean": "rimraf build",
-    "build": "rimraf node_modules/jupyterlab && npm install && webpack --config webpack.conf.js",
+    "update": "rimraf node_modules/jupyterlab && npm install",
+    "build": "npm run update && npm run build:extension",
+    "build:extension": "webpack --config webpack.conf.js",
     "postinstall": "npm dedupe",
     "test": "echo 'no tests specified'"
   },

+ 1 - 0
package.json

@@ -66,6 +66,7 @@
     "build:examples": "node scripts/buildexamples.js",
     "build:src": "tsc --project src && node scripts/copyfiles.js",
     "build:test": "tsc --project test/src && webpack --config test/webpack.conf.js",
+    "build:serverextension": "cd jupyterlab && npm run build && cd ..",
     "clean": "rimraf docs && rimraf lib && rimraf test/build && rimraf test/coverage",
     "clean:examples": "node scripts/cleanexamples.js",
     "docs": "typedoc --mode modules --module commonjs --excludeNotExported --target es5 --moduleResolution node --out docs/ src",

+ 18 - 28
setup.py

@@ -15,18 +15,19 @@ import platform
 import shutil
 
 here = os.path.dirname(os.path.abspath(__file__))
-node_root = os.path.join(here, 'jupyterlab')
+extension_root = os.path.join(here, 'jupyterlab')
 is_repo = os.path.exists(os.path.join(here, '.git'))
 
-npm_path = os.pathsep.join([
-    os.path.join(node_root, 'node_modules', '.bin'),
-    os.environ.get('PATH', os.defpath),
-])
+def run(cmd, cwd=None):
+    """Run a command
+
+    >>> run('npm install', cwd='./subdir')
+    """
+    check_call(cmd.split(), cwd=cwd, stdout=sys.stdout, stderr=sys.stderr)
 
 from distutils import log
 log.set_verbosity(log.DEBUG)
 log.info('setup.py entered')
-log.info('$PATH=%s' % os.environ['PATH'])
 
 LONG_DESCRIPTION = 'This is a very early pre-alpha developer preview. It is not ready for general usage yet.'
 
@@ -53,14 +54,11 @@ def js_prerelease(command, strict=False):
                     log.warn('rebuilding js and css failed (not a problem)')
                     log.warn(str(e))
             command.run(self)
-            update_package_data(self.distribution)
     return DecoratedCommand
 
 def update_package_data(distribution):
-    """update package_data to catch changes during setup"""
+    """update build_py options to get package_data changes"""
     build_py = distribution.get_command_obj('build_py')
-    # distribution.package_data = find_package_data()
-    # re-init build_py options which load package_data
     build_py.finalize_options()
 
 
@@ -69,7 +67,8 @@ class NPM(Command):
 
     user_options = []
 
-    node_modules = os.path.join(node_root, 'node_modules')
+    node_modules = os.path.join(here, 'node_modules')
+    jlab_node_modules = os.path.join(extension_root, 'node_modules')
 
     targets = [
         os.path.join(here, 'jupyterlab', 'build', 'bundle.js'),
@@ -83,37 +82,28 @@ class NPM(Command):
 
     def has_npm(self):
         try:
-            check_call(['npm', '--version'])
+            run('npm --version')
             return True
         except:
             return False
 
-    def should_run_npm_install(self):
-        package_json = os.path.join(node_root, 'package.json')
-        node_modules_exists = os.path.exists(self.node_modules)
-        return self.has_npm()
-
     def run(self):
         has_npm = self.has_npm()
         if not has_npm:
             log.error("`npm` unavailable.  If you're running this command using sudo, make sure `npm` is available to sudo")
-
-        env = os.environ.copy()
-        env['PATH'] = npm_path
-
-        if self.should_run_npm_install():
+        if not os.path.exists(self.node_modules):
             log.info("Installing build dependencies with npm.  This may take a while...")
-            # remove just jupyterlab so that it is always updated
-            shutil.rmtree(os.path.join(self.node_modules, 'jupyterlab'), ignore_errors=True)
-            check_call(['npm', 'install'], cwd=node_root, stdout=sys.stdout, stderr=sys.stderr)
-            check_call(['npm', 'run', 'build'], cwd=node_root, stdout=sys.stdout, stderr=sys.stderr)
-            os.utime(self.node_modules, None)
+            run('npm install', cwd=here)
+        if not os.path.exists(self.jlab_node_modules):
+            log.info("Installing extension build dependencies with npm.  This may take a while...")
+            run('npm install', cwd=extension_root)
+        run('npm run build:serverextension')
 
         for t in self.targets:
             if not os.path.exists(t):
                 msg = 'Missing file: %s' % t
                 if not has_npm:
-                    msg += '\nnpm is required to build a development version of widgetsnbextension'
+                    msg += '\nnpm is required to build the development version'
                 raise ValueError(msg)
 
         # update package data in case this created new files