Add PropertyExists MSBuild condition function to distinguish between undefined and empty properties #12405
+131
−0
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR adds a new
PropertyExists()
condition function to MSBuild that allows checking whether a property is actually defined, rather than relying on the current behavior where undefined properties are coerced to empty strings.Problem
Currently in MSBuild, there's no way to distinguish between:
<Property></Property>
Both scenarios result in an empty string when the property is referenced, making it impossible to implement proper coalescing logic where an explicitly empty property should override another property's value.
Solution
Added a new
PropertyExists('PropertyName')
function that:true
if the property exists in the project (even if it has an empty value)false
if the property is completely undefinedPropertyExists('$(SomePropertyName)')
Usage Examples
Implementation
IConditionEvaluationState
interface withPropertyExists(string propertyName)
methodConditionEvaluationState
that delegates toExpander.PropertyExists()
PropertyExists()
method toExpander
class that checks if property is non-nullPropertyExists
function case toFunctionCallExpressionNode.BoolEvaluate()
Testing
Exists()
andHasTrailingSlash()
functionsFixes #12404.
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.