abpframework/abp · error · UserFriendlyException

Can not set {companyName} if {companyNamePlaceHolder} is nul

Error message

Can not set {companyName} if {companyNamePlaceHolder} is null.

What it means

Thrown by the `SolutionRenamer` constructor when a `companyName` is supplied but `companyNamePlaceHolder` is null. It is a `UserFriendlyException` enforcing the invariant that you can only rename the company if a placeholder for it exists in the template.

Source

Thrown at framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs:26

public class SolutionRenamer
{
    private readonly List<FileEntry> _entries;
    private readonly string _companyNamePlaceHolder;
    private readonly string _projectNamePlaceHolder;

    private readonly string _companyName;
    private readonly string _projectName;

    public SolutionRenamer(List<FileEntry> entries, string companyNamePlaceHolder, string projectNamePlaceHolder, string companyName, string projectName)
    {
        if (string.IsNullOrWhiteSpace(companyName))
        {
            companyName = null;
        }

        if (companyNamePlaceHolder == null && companyName != null)
        {
            throw new UserFriendlyException($"Can not set {nameof(companyName)} if {nameof(companyNamePlaceHolder)} is null.");
        }

        _entries = entries;

        _companyNamePlaceHolder = companyNamePlaceHolder;
        _projectNamePlaceHolder = projectNamePlaceHolder ?? throw new ArgumentNullException(nameof(projectNamePlaceHolder));

        _companyName = companyName;
        _projectName = projectName ?? throw new ArgumentNullException(nameof(projectName));
    }

    public void Run()
    {
        if (_companyNamePlaceHolder != null)
        {
            if (_companyName != null)
            {
                RenameHelper.RenameAll(_entries, _companyNamePlaceHolder, _companyName);

View on GitHub (pinned to 7ed43b1931)

Solutions

  1. Omit `companyName` (pass null) when the template has no company placeholder.
  2. If you do need a company name, use a template that defines a company placeholder and pass the matching `companyNamePlaceHolder`.

Example fix

// before
new SolutionRenamer(entries, companyNamePlaceHolder: null, projectNamePlaceHolder: "MyProj", companyName: "Acme", projectName: "BookStore");
// after (no company placeholder => no company name)
new SolutionRenamer(entries, null, "MyProj", companyName: null, projectName: "BookStore");
Defensive patterns

Strategy: validation

Validate before calling

if (!string.IsNullOrWhiteSpace(companyName) && string.IsNullOrWhiteSpace(companyNamePlaceHolder))
    throw new ArgumentException("companyName requires a non-null companyNamePlaceHolder.");
var renamer = new SolutionRenamer(entries, companyNamePlaceHolder, projectNamePlaceHolder, companyName, projectName);

Type guard

static bool CanSetCompany(string placeHolder, string company) =>
    string.IsNullOrWhiteSpace(company) || !string.IsNullOrWhiteSpace(placeHolder);

Try / catch

try { new SolutionRenamer(entries, companyPH, projectPH, company, project); }
catch (UserFriendlyException ex) when (ex.Message.Contains("companyNamePlaceHolder"))
{
    // drop the company name and retry, or choose a template with a company placeholder
}

Prevention

When it happens

Trigger: Calling the renamer with `companyName` set while `companyNamePlaceHolder` is null, i.e. asking to replace a company name when the template does not define a company placeholder.

Common situations: A template/module that has no company segment (single-name solution) but the user passes `--company-name`; misordered arguments when constructing `SolutionRenamer` programmatically.

Related errors


AI-assisted analysis of abpframework/abp@7ed43b1931 (2026-08-13). Data as JSON: /api/errors/36210912b2367125. Report an issue: GitHub.