2

我正在开发一个生成一些文件的示意图。我想在当前目录中有新文件,即

我的项目根目录是/src/app. 当我在文件夹/src/app/features/f1中时,输入

ng g my:some-schemaitc --name=name

我期待新文件

/src/app/features/f1/name.ts

相反,结果是

/src/app/name.ts

我想实现与ng g class --name=name. 当我输入ng g class --name=class目录/src/app/features/f1时,结果将是

/src/app/features/f1/class.ts

我试图模仿 Angularng g class行为原理图源代码,但没有令人满意的结果。我的代码几乎相同。

有人利用当前路径吗?

4

2 回答 2

2

偶然我发现了一个__dirname存储当前路径的全局变量。例如:

console.log('DIR', __dirname);
于 2019-09-04T07:09:57.177 回答
0

按照角度文档中提到的步骤

你会遇到一些问题。例如

1) const workspaceConfig = tree.read('/angular.json');

// 使用 'schematics' 命令时将为空,但使用 'ng g' 命令时会起作用。

2) 同样,在使用 'schematics' 命令时,'options.path' 将是未定义的,但在使用 'ng g' 命令时会起作用。

您需要将路径添加到 schema.json 文件,然后在您的函数中,您应该能够使用“options.path”来获取当前位置。但是,正如我提到的,在使用“原理图”命令时,我无法让它工作。我只能在使用“ng g”命令时让它工作。

所以作为一个例子,这里是我的文件

1) ..schematics/ng-generate/customComponent/schema.json

{
    "$schema": "http://json-schema.org/schema",
    "id": "GenerateCustomComponent",
    "title": "Generate Custom Component",
    "type": "object",
    "properties": {
        "name": {
            "description": "The name for the custom component.",
            "type": "string",
            "x-prompt": "What is the name for the custom component?"
        },
        "path": {
            "type": "string",
            "format": "path",
            "description": "The path at which to create the component file, relative to the current workspace. Default is a folder with the same name as the component in the project root.",
            "visible": false
        }
    },
    "required": [
        "name"
    ]
}

2) ..schematics/ng-generate/customComponent/schema.ts

import { Schema as ComponentSChema } from '@schematics/angular/component/schema';

export interface Schema extends ComponentSChema {
    // The name of the custom component
    name: string;
}

2) ..schematics/ng-generate/customComponent/index.ts

import {
  Rule, Tree, SchematicsException,
  apply, url, applyTemplates, move,
  chain, mergeWith
} from '@angular-devkit/schematics';

import { strings, experimental, normalize } from '@angular-devkit/core';

import { Schema as CustomSchema } from './schema';

export function generate(options: CustomSchema): Rule {
    return (tree: Tree) => {
        const workspaceConfig = tree.read('/angular.json'); // will return null when using schematics command but will work when using ng g
        console.log('workspaceConfig::', workspaceConfig);
        console.log('path:', options.path); // will be undefined when using schematics command but will work when using ng g
        
        // from now following along with angular docs with slight modifications. 
        if (workspaceConfig && !options.path) {
            const workspaceContent = workspaceConfig.toString();
            console.log('workspaceContent::', workspaceContent);
            
            const workspace: experimental.workspace.WorkspaceSchema = JSON.parse(workspaceContent);
            console.log('workspace', workspace);
            
            options.project = workspace.defaultProject;
            const projectName = options.project as string;
            const project = workspace.projects[projectName];
            const projectType = project.projectType === 'application' ? 'app' : 'lib';
            console.log('projectType::', projectType);
            
            options.path = `${project.sourceRoot}/${projectType}`;
        }

        
        if (options.path) { 
           // this will be used by the ng g command
            const templateSource = apply(url('./files'), [
                applyTemplates({
                    classify: strings.classify,
                    dasherize: strings.dasherize,
                    name: options.name
                }),
                move(normalize(options.path as string))
            ]);
            return chain([
                mergeWith(templateSource)
            ]);
        } else {
            // this will be used by the schematics command
            const templateSource = apply(url('./files'), [
                applyTemplates({
                    classify: strings.classify,
                    dasherize: strings.dasherize,
                    name: options.name
                })
            ]);
            return chain([
                mergeWith(templateSource)
            ]);
        }
    };
}

于 2020-06-09T20:55:50.330 回答