Skip to content
This repository was archived by the owner on Oct 2, 2020. It is now read-only.
This repository was archived by the owner on Oct 2, 2020. It is now read-only.

Different cache folder for different envs #76

@fasterthanlime

Description

@fasterthanlime

This issue applies both to electron-compile and electron-compilers, sorry

Reading through a bunch of code right now to find out if a different $TEMP/compileCache_${hash} will get generated if NODE_ENV changes, and.. it doesn't like it does?

Here's the default cache directory code:

export function calculateDefaultCompileCacheDirectory() {
  let tmpDir = process.env.TEMP || process.env.TMPDIR || '/tmp';
  let hash = require('crypto').createHash('md5').update(process.execPath).digest('hex');

  let cacheDir = path.join(tmpDir, `compileCache_${hash}`);
  mkdirp.sync(cacheDir);

  d(`Using default cache directory: ${cacheDir}`);
  return cacheDir;
}

The problem is:

  • One might want to enable code coverage (or other babel plugins) only in testing
  • But since all files are cached by their content
  • And the files wouldn't change, only the compiler settings would
  • Then electron-compile would just happily serve the old cached versions (which may have coverage instrumentation when they shouldn't, and the other way around).

You can probably reproduce the problem easily if you use electron-compile with a .babelrc like:

{
  "env": {
    "production": {
      "presets": ["es2016-node5", "react"],
      "sourceMaps": false
    },
    "development": {
      "presets": ["es2016-node5", "react"],
      "sourceMaps": "inline"
    }
  }
}

run it once with NODE_ENV=production, then again with NODE_ENV=development, I'm 80% confident you'd end up not seeing sourceMaps still.


Here's my proposal for electron-compile:

  • Change calculateDefaultCompileCacheDirectory to feed off of

Tangentially, here's what I've got planned for electron-compilers:

  • Add way for compilers to get an input sourceMap
    • compilerContext seems okay
  • Make babel compiler consume that input sourceMap when it's there
  • Drop sorcery dependency
  • Make both coverage options (typescript & babel) only apply when NODE_ENV=test
    • Alternatively: only do env matching when coverage is a string, and coverage: true would always instrument, so that the old behavior is retained?
    • Alternatively: don't change anything about the coverage option, force folks to use env blocks
    • see fasterthanlime@a98839a
  • Make both coverage option use babel-plugin-istanbul (a relatively thin wrapper over new-istanbul's instrumenting lib).
    • For babel, this means pushing adding a plug-in to the plugins list
    • For typescript, this.. requires babel :/
    • see fasterthanlime@a98839a
  • Drop dependency to istanbul 0.4.5 (legacy istanbul) - it's somehow still in electron-compile's package.json
  • Document how to set up typescript+babel (babel block in the typescript config)
  • Document how to set up coverage instrumentation
  • Document what coverage instrumentation does (collects coverage info using the new istanbul, aka istanbuljs/istanbuljs, into the global __coverage__ variable)
  • Give an example of collecting/reporting from a __coverage__ variable, with proper sourceMap support (it's like 8 lines).

Let me know if any of that sounds bad @paulcbetts & others so I can adjust plans accordingly!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions