Content/tasks.publish.cake (165 lines of code) (raw):
#addin "Microsoft.Web.Xdt&version=3.0.0"
using Microsoft.Web.XmlTransform;
Action<string, string, List<string>> transform = (sourceFile, targetFile, transforms) =>
{
var _appliedTransforms = new List<String>();
using(var _document = new XmlTransformableDocument { PreserveWhitespace = true })
{
_document.Load(sourceFile);
foreach(var _transform in transforms)
{
var _transformFile = File($"{sourceFile}.{_transform}.transform");
if (!FileExists(_transformFile))
{
continue;
}
using(var _transformation = new Microsoft.Web.XmlTransform.XmlTransformation(_transformFile))
{
if(!_transformation.Apply(_document))
{
throw new Exception($"Failed to transform \"{sourceFile}\" using \"{_transformFile}\" to \"{targetFile}\"");
}
_appliedTransforms.Add(_transform);
}
}
var _targetFilePath = new FilePath(targetFile);
var _targetDirectory = _targetFilePath.GetDirectory();
if (!DirectoryExists(_targetDirectory))
{
CreateDirectory(_targetDirectory);
}
_document.Save(targetFile);
var _transformationsMessage = _appliedTransforms.Any()
? string.Join(">", _appliedTransforms)
: "transforms not found!";
Information($" + updated '{targetFile}': {_transformationsMessage}");
}
};
Action<string, string, string> copyClientAssets = (srcRootDir, layer, solutionName) =>
{
Verbose($"Executing [copyClientAssets] with params ({srcRootDir}, {layer}, {solutionName})");
var _template = $"{srcRootDir}/{layer}/*/client/build";
var _directoryList = GetDirectories(_template);
// iterate over every client build folder
foreach(var _directory in _directoryList)
{
Verbose($"Copy client assets from: {_directory.ToString()}");
var _pathSegments = _directory.ToString()
.Replace("/client/build", "")
.Split('/');
var _project = _pathSegments[_pathSegments.Length -1];
// copy client build artifacts into a project wildcard folder
var _targetDir = Sitecore.Parameters.SupportHelix20
? $"{_directory}/../../website/dist/{solutionName}/{layer}/{_project}"
: $"{_directory}/../../code/dist/{solutionName}/{layer}/{_project}";
CopyDirectory(_directory, _targetDir);
}
};
Action<string, string> copySerializationFiles = (srcRootDir, layer) =>
{
Verbose($"Executing [copySerializationFiles] with params ({srcRootDir}, {layer})");
var _directoryList =
GetDirectories($"{srcRootDir}/{layer}/*/serialization") +
GetDirectories($"{srcRootDir}/{layer}/*/serialization.*");
foreach(var _directory in _directoryList)
{
Verbose($"Copy Unicorn files from: {_directory}");
var _pathSegments = _directory.Segments;
var _project = _pathSegments[_pathSegments.Length - 2];
var _serialization = _pathSegments[_pathSegments.Length - 1];
var _targetDir = Sitecore.Parameters.SupportHelix20
? $"{_directory}/../website/App_Data/{Sitecore.Parameters.UnicornSerializationRoot}/{layer}/{_project}/{_serialization}"
: $"{_directory}/../code/App_Data/{Sitecore.Parameters.UnicornSerializationRoot}/{layer}/{_project}/{_serialization}";
CopyDirectory(_directory, _targetDir);
}
};
Action<string, string, string, MSBuildToolVersion> publishProject = (projectFilePath, buildConfiguration, dest, msBuildToolVersion) =>
{
Verbose($"Executing [publishProject] with params ({projectFilePath}, {buildConfiguration}, {dest}, {msBuildToolVersion.ToString()})");
var _settings = new MSBuildSettings()
.SetConfiguration(buildConfiguration)
.SetVerbosity(Verbosity.Minimal)
.UseToolVersion(msBuildToolVersion)
.WithTarget("Build")
.WithProperty("DeployOnBuild", "true")
.WithProperty("DeployDefaultTarget", "WebPublish")
.WithProperty("WebPublishMethod", "FileSystem")
.WithProperty("DeleteExistingFiles", "false")
.WithProperty("publishUrl", dest)
.WithProperty("_FindDependencies", "false");
MSBuild(projectFilePath, _settings);
};
Action<string, string, string, string, MSBuildToolVersion> publishLayer = (srcRootDir, layer, buildConfiguration, dest, msBuildToolVersion) =>
{
Verbose($"Executing [publishLayer] with params ({srcRootDir}, {layer}, {buildConfiguration}, {dest}, {msBuildToolVersion.ToString()})");
// perform cleanup layer configs directory operation for "Debug" configuration
// Disable configs cleanup as Cake doesn't support glob patterns for UNC and CleanDirectory won't delete configs correctly in multiproject setup
/*/if (buildConfiguration == "Debug")
{
var _configsDirPath = $"{dest}/App_Config/Include/{layer}";
if (DirectoryExists(_configsDirPath)) {
Information($"Cleaning configs directory: {_configsDirPath}");
CleanDirectory(_configsDirPath);
}
}*/
var _projectFilePathList = Sitecore.Parameters.SupportHelix20
? GetFiles($"{srcRootDir}/{layer}/**/website/*.csproj")
: GetFiles($"{srcRootDir}/{layer}/**/code/*.csproj");
foreach(var _projectFilePath in _projectFilePathList)
{
publishProject(_projectFilePath.ToString(), buildConfiguration, dest, msBuildToolVersion);
}
};
Sitecore.Tasks.PublishFoundationTask = Task("Publish :: Foundation")
.Description("Publishes all Foundation-layer projects to the publishing target directory (`PUBLISHING_TARGET_DIR`) using MsBuild.")
.Does(() =>
{
var _layer = "Foundation";
Sitecore.Utils.AssertIfNullOrEmpty(Sitecore.Parameters.PublishingTargetDir, "PublishingTargetDir", "PUBLISHING_TARGET_DIR");
Sitecore.Utils.AssertIfNullOrEmpty(Sitecore.Parameters.BuildConfiguration, "SrcConfigsDir", "SRC_CONFIGS_DIR");
Sitecore.Utils.AssertIfNullOrEmpty(Sitecore.Parameters.SrcDir, "SrcDir", "SRC_DIR");
if (Sitecore.Parameters.PublishSerializationItems) {
copySerializationFiles(Sitecore.Parameters.SrcDir, _layer);
}
copyClientAssets(Sitecore.Parameters.SrcDir, _layer, Sitecore.Parameters.SolutionName);
publishLayer(
Sitecore.Parameters.SrcDir,
_layer,
Sitecore.Parameters.BuildConfiguration,
Sitecore.Parameters.PublishingTargetDir,
Sitecore.Parameters.MsBuildToolVersion);
});
Sitecore.Tasks.PublishFeatureTask = Task("Publish :: Features")
.Description("Publishes all Feature-layer projects to the publishing target directory (`PUBLISHING_TARGET_DIR`) using MsBuild.")
.Does(() =>
{
var _layer = "Feature";
Sitecore.Utils.AssertIfNullOrEmpty(Sitecore.Parameters.PublishingTargetDir, "PublishingTargetDir", "PUBLISHING_TARGET_DIR");
Sitecore.Utils.AssertIfNullOrEmpty(Sitecore.Parameters.BuildConfiguration, "SrcConfigsDir", "SRC_CONFIGS_DIR");
Sitecore.Utils.AssertIfNullOrEmpty(Sitecore.Parameters.SrcDir, "SrcDir", "SRC_DIR");
if (Sitecore.Parameters.PublishSerializationItems) {
copySerializationFiles(Sitecore.Parameters.SrcDir, _layer);
}
copyClientAssets(Sitecore.Parameters.SrcDir, _layer, Sitecore.Parameters.SolutionName);
publishLayer(
Sitecore.Parameters.SrcDir,
_layer,
Sitecore.Parameters.BuildConfiguration,
Sitecore.Parameters.PublishingTargetDir,
Sitecore.Parameters.MsBuildToolVersion);
});
Sitecore.Tasks.PublishProjectTask = Task("Publish :: Projects")
.Description("Publishes all Project-layer projects to the publishing target directory (`PUBLISHING_TARGET_DIR`) using MsBuild.")
.Does(() =>
{
var _layer = "Project";
Sitecore.Utils.AssertIfNullOrEmpty(Sitecore.Parameters.PublishingTargetDir, "PublishingTargetDir", "PUBLISHING_TARGET_DIR");
Sitecore.Utils.AssertIfNullOrEmpty(Sitecore.Parameters.BuildConfiguration, "SrcConfigsDir", "SRC_CONFIGS_DIR");
Sitecore.Utils.AssertIfNullOrEmpty(Sitecore.Parameters.SrcDir, "SrcDir", "SRC_DIR");
if (Sitecore.Parameters.PublishSerializationItems) {
copySerializationFiles(Sitecore.Parameters.SrcDir, _layer);
}
copyClientAssets(Sitecore.Parameters.SrcDir, _layer, Sitecore.Parameters.SolutionName);
publishLayer(
Sitecore.Parameters.SrcDir,
_layer,
Sitecore.Parameters.BuildConfiguration,
Sitecore.Parameters.PublishingTargetDir,
Sitecore.Parameters.MsBuildToolVersion);
});