/// <summary> /// Creates a props file to find best $(Configuration) from $(BuildConfigurations) for any $(BuildConfiguration) /// </summary> private void CreateBuildConfigurationPropsFile(string fileName) { var buildConfigurationProps = ProjectRootElement.Create(); // pull apart BuildConfiguration, but don't set any derived properties // we do this even when Configuration is already set because we want to // parse out the BuildConfiguration-derived property values as _bc_*. // In the case Configuration is set we'll not use the parsed values, // and immediately overwrite them with the values parsed from Configuration. ParseProperties(BuildConfigurationProperty, buildConfigurationProps, false, p => !p.Independent, "_bc_"); var projectConfigurationNotSet = $"'$({ConfigurationProperty})' == ''"; var buildConfigurationsPropertyGroup = buildConfigurationProps.CreatePropertyGroupElement(); buildConfigurationProps.AppendChild(buildConfigurationsPropertyGroup); // Only set props used for when Configuration is not set. buildConfigurationsPropertyGroup.Condition = projectConfigurationNotSet; // get path to import var buildConfigurationImportName = $"_import_{BuildConfigurationProperty}_props"; var significantBuildConfiguration = ConfigurationFactory.IdentityConfiguration.GetSignificantConfigurationStrings().First(); var buildConfigurationImportPath = $"{CurrentDirectoryIdentifier}{ConfigurationPropsPrefix}.{significantBuildConfiguration}{PropsFileExtension}"; buildConfigurationsPropertyGroup.AddProperty(buildConfigurationImportName, buildConfigurationImportPath); // if BuildConfigurations is not set, then default Configuration to BuildConfiguration var defaultConfigurationToBuildConfiguration = buildConfigurationsPropertyGroup.AddProperty(ConfigurationProperty, $"$({BuildConfigurationProperty})"); defaultConfigurationToBuildConfiguration.Condition = $"'$({AvailableBuildConfigurationsProperty})' == ''"; var buildConfigurationsIsSet = $"'$({AvailableBuildConfigurationsProperty})' != ''"; // Set error on missing import var missingImportError = buildConfigurationsPropertyGroup.AddProperty(ErrorMessageProperty, $"$({ErrorMessageProperty}){ConfigurationProperty} is not set and $({BuildConfigurationProperty}) is not a known value for {BuildConfigurationProperty}."); missingImportError.Condition = $"{buildConfigurationsIsSet} AND !Exists('$({buildConfigurationImportName})')"; // import props to set ProjectConfiguration var buildConfigurationImport = buildConfigurationProps.CreateImportElement($"$({buildConfigurationImportName})"); buildConfigurationImport.Condition = $"{buildConfigurationsIsSet} AND {projectConfigurationNotSet} AND Exists('$({buildConfigurationImportName})')"; buildConfigurationProps.AppendChild(buildConfigurationImport); // iterate over all possible configuration strings foreach (var buildConfiguration in ConfigurationFactory.GetSignificantConfigurations()) { CreateBuildConfigurationPropsFile(buildConfiguration); } buildConfigurationProps.Save(Path.Combine(PropsFolder, fileName)); }