in src/Tasks/Microsoft.NET.Build.Tasks/ProduceContentAssets.cs [193:259]
private bool IsPreprocessorFile(ITaskItem contentFile) =>
!string.IsNullOrEmpty(contentFile.GetMetadata(MetadataKeys.PPOutputPath));
private void ProduceContentAsset(ITaskItem contentFile)
{
string resolvedPath = contentFile.ItemSpec;
string pathToFinalAsset = resolvedPath;
string ppOutputPath = contentFile.GetMetadata(MetadataKeys.PPOutputPath);
string packageName = contentFile.GetMetadata(MetadataKeys.NuGetPackageId);
string packageVersion = contentFile.GetMetadata(MetadataKeys.NuGetPackageVersion);
if (!string.IsNullOrEmpty(ppOutputPath))
{
if (string.IsNullOrEmpty(ContentPreprocessorOutputDirectory))
{
throw new BuildErrorException(Strings.ContentPreproccessorParameterRequired, nameof(ProduceContentAssets), nameof(ContentPreprocessorOutputDirectory));
}
// We need the preprocessed output, so let's run the preprocessor here
string relativeOutputPath = Path.Combine(packageName, packageVersion, ppOutputPath);
if (AssetPreprocessor.Process(resolvedPath, relativeOutputPath, out pathToFinalAsset))
{
_fileWrites.Add(new TaskItem(pathToFinalAsset));
}
}
if (contentFile.GetBooleanMetadata(MetadataKeys.CopyToOutput) == true)
{
string outputPath = contentFile.GetMetadata(MetadataKeys.OutputPath);
outputPath = string.IsNullOrEmpty(outputPath) ? ppOutputPath : outputPath;
if (!string.IsNullOrEmpty(outputPath))
{
var item = new TaskItem(pathToFinalAsset);
item.SetMetadata("TargetPath", outputPath);
item.SetMetadata(MetadataKeys.NuGetPackageId, packageName);
item.SetMetadata(MetadataKeys.NuGetPackageVersion, packageVersion);
_copyLocalItems.Add(item);
}
else
{
Log.LogWarning(Strings.ContentItemDoesNotProvideOutputPath, pathToFinalAsset, MetadataKeys.CopyToOutput, MetadataKeys.OutputPath, MetadataKeys.PPOutputPath);
}
}
// TODO if build action is none do we even need to write the processed file above?
string buildAction = contentFile.GetMetadata(MetadataKeys.BuildAction);
if (!string.Equals(buildAction, "none", StringComparison.OrdinalIgnoreCase))
{
var item = new TaskItem(pathToFinalAsset);
item.SetMetadata(MetadataKeys.NuGetPackageId, packageName);
item.SetMetadata(MetadataKeys.NuGetPackageVersion, packageVersion);
// We'll put additional metadata on the item so we can convert it back to the real item group in our targets
item.SetMetadata("ProcessedItemType", buildAction);
// TODO is this needed for .NETCore?
// If this is XAML, the build targets expect Link metadata to construct the relative path
if (string.Equals(buildAction, "Page", StringComparison.OrdinalIgnoreCase))
{
item.SetMetadata("Link", Path.Combine("NuGet", packageName, packageVersion, Path.GetFileName(resolvedPath)));
}
_contentItems.Add(item);
}
}