myermian
myermian

Reputation: 32515

My tsconfig.json cannot find a module in my node_modules directory, not sure what is wrong

I have the following hierarchy:

dist/
 |- BuildTasks/
  |- CustomTask/
   - CustomTask.js
node_modules/
source/
 |- BuildTasks/
  |- CustomTask/
   - CustomTask.ts
   - tsconfig.json

Additionally, I am trying to create a VSTS Task extension for internal (private) usage. Originally, I had my tsconfig.json at my root directory, and everything worked just fine on my local machine. The problem is that a VSTS Extension requires all the files to be included in the same directory as the task folder itself. See https://github.com/Microsoft/vsts-task-lib/issues/274 for more information:

you need to publish a self contained task folder. the agent doesnt run npm install to restore your dependencies.


Originally, I had a this problem solved by include a step to copy the entire node_modules directory into each Task folder, in this case my CustomTask folder which contains my JS file. But, this seems a bit much considering that not every task I am writing has the same module requirements.

My idea was to create a tsconfig.json in each of the Task folders which would specify to create a single output file containing all of the dependent modules, but unfortunately it is not working:

{
  "compilerOptions": {
    "baseUrl": ".",
    "target": "ES6",
    "module": "system",
    "strict": true,
    "rootDir": ".",
    "outFile": "../../../dist/BuildTasks/CustomTask/CustomTask.js",
    "paths": {
      "*" : ["../../../node_modules/*"]
    }
  }
}

Prior to adding the "paths", I was getting the following errors:

error TS2307: Cannot find module 'vsts-task-lib/task'.
error TS2307: Cannot find module 'moment'.

After adding the paths, I still get the error that it cannot find the module 'moment', which is in my node_modules directory. Also, when I look at the output JS it seems that it didn't include the 'vsts-tasks-lib' code necessary, maybe because it still had an error in regards to the 'moment' module? Not sure what I missed?

Upvotes: 2

Views: 2081

Answers (1)

starian chen-MSFT
starian chen-MSFT

Reputation: 33728

Using webpack to compile JavaScript modules, simple sample:

webpack.config.js:

const path = require('path');

module.exports = {
    entry: './testtask.ts',
    module: {
        rules: [
          {
              test: /\.tsx?$/,
              use: 'ts-loader',
              exclude: /node_modules/
          }
        ]
    },
    resolve: {
        extensions: ['.tsx', '.ts', '.js']
    },
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    node: {
        fs: 'empty'
    },
    target: 'node'
};

After that, there are just bundle.js and task.json in task folder.

Update: sample code in testtask.ts:

import tl = require('vsts-task-lib/task');
import fs = require('fs');
console.log('Set variable================');
tl.setVariable('varCode1', 'code1');
tl.setTaskVariable('varTaskCode1', 'taskCode1');
var taskVariables = tl.getVariables();
console.log("variables are:");
for (var taskVariable of taskVariables) {
    console.log(taskVariable.name);
    console.log(taskVariable.value);
}
console.log('##vso[task.setvariable variable=LogCode1;]LogCode1');
console.log('end========================');
console.log('current path is:' + __dirname);
fs.appendFile('TextFile1.txt', 'data to append', function (err) {
    if (err) throw err;
    console.log('Saved!');
});

console.log('configure file path:' + process.env.myconfig);
console.log('configure file path2:' + process.env.myconfig2);

Upvotes: 1

Related Questions