如何使用 .NET CLI 自定义模板获取项目名称的驼峰式大小写版本

Ste*_* CO 4 templates dotnet-cli

我正在尝试为 dotnet CLI 创建一个模板项目,并且需要更改项目名称的格式以进行某些替换。具体来说,我们域内的约定使用项目名称的驼峰版本作为需要存储在配置文件中的标识符。

通常,模板会执行看似非常简单的搜索/将模板项目名称替换为您使用 dotnet new 创建的项目的名称。此搜索区分大小写,因此它只会选取大小写完全相同的名称实例。

但就我而言,我还需要它来匹配名称的驼峰式大小写版本,并将其替换为新名称的驼峰式大小写版本。这可能吗?

这个参考资料有相当多的信息,表明有一个参数生成器支持大小写转换,但特别说它不支持驼峰式大小写。我真正需要的是能够将第一个字符从大写更改为小写。

知道如何插入项目名称的驼峰式大小写版本吗?

这是我的实验 template.json 的大小写和命令行参数,但显然没有骆驼外壳。

{
  "$schema": "http://json.schemastore.org/template",
  "identity": "TemplateTest.CSharp",
  "groupIdentity": "TemplateTest.Console",
  "author": "TemplateTest",
  "classifications": [ "Common", "Console" ],
  "name": "TemplateTest console template",
  "shortName": "test",
  "preferNameDirectory": true,
  "tags": {
    "language": "C#"
  },
  "sourceName": "TemplateTest",
  "symbols": {
    "apiname": {
      "type": "parameter",
      "datatype": "text",
      "defaultValue": "##FIX THIS##",
      "replaces": "templateTest"
    },
    "nameUpper": {
      "type": "generated",
      "generator": "casing",
      "parameters": {
        "source": "name",
        "toLower": false
      },
      "replaces": "TEMPLATETEST"
    },
    "nameLower": {
      "type": "generated",
      "generator": "casing",
      "parameters": {
        "source": "name",
        "toLower": true
      },
      "replaces": "templatetest"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ith 8

Pull request #1723引入了一个(尚未记录的)join生成器。有了这个,以及同样未记录的派生符号,您可以将项目名称分成[第一个字母]和[其余],将[第一个字母]转换为小写,然后重新连接它们。假设您从 PascalCase 开始,这将为您提供驼峰命名法的名称。

还有另一个选项可以定义替换每个大写字母的正则表达式

下面,符号temp1将项目名称传递给自定义转换,它本身是自定义转换和 的lowerCaseFirstLetter组合。该符号通过 Transform 传递名称。firstLetterlowerCasetemp2afterFirstLetter

firstLetterafterFirstLetter使用相同的正则表达式捕获第一个字母 as$1和其余字母 as $2,但分别仅返回第一个和第二个捕获组。

最后,符号apiname连接temp1temp2,并使用结果替换templateTest模板内容中的实例。

"symbols": {
  "temp1": {
    "type": "derived",
    "valueSource": "name",
    "valueTransform": "lowerCaseFirstLetter"
  },
  "temp2": {
    "type": "derived",
    "valueSource": "name",
    "valueTransform": "afterFirstLetter"
  },
  "apiname": {
    "type": "generated",
    "generator": "join",
    "replaces": "templateTest",
    "parameters": {
      "symbols": [
        {
          "type": "ref",
          "value": "temp1"
        },
        {
          "type": "ref",
          "value": "temp2"
        }
      ]
    }
  }
},
"forms": {
  "lowerCaseFirstLetter": {
    "identifier": "chain",
    "steps": [
      "firstLetter",
      "lowerCase"
    ]
  },
  "firstLetter": {
    "identifier": "replace",
    "pattern": "^(.)(.*)",
    "replacement": "$1"
  },
  "afterFirstLetter": {
    "identifier": "replace",
    "pattern": "^(.)(.*)",
    "replacement": "$2"
  },
  "lowerCase": {
    "identifier": "lowerCase"
  }
}
Run Code Online (Sandbox Code Playgroud)