gpt4 book ai didi

c# - 将 MSBuild 生成的文件添加到 Visual Studio 解决方案资源管理器

转载 作者:行者123 更新时间:2023-11-30 18:31:56 33 4
gpt4 key购买 nike

我有几个 MSBuild 任务在构建过程中生成新文件。自定义目标在文件生成后将其添加到 Compile ItemGroup。因此,如果运行了我的目标,构建将起作用,但我想使用 MSBuild 的增量构建功能,如果文件自上次构建以来未被修改,则跳过这些目标。但是,如果构建跳过目标,则不会包含生成的文件。

所以我想让构建将文件添加到解决方案资源管理器中。我意识到我可以手动添加文件,这可能是我必须走的路,但我真的很想以编程方式添加生成的文件。

我目前有一个名为 Custom.targets 的文件。它包含在每个项目中并注入(inject)新目标。我试过在项目中包含 *.cs,但没有成功。

最佳答案

我最终做了类似于 granadaCoder 的事情。我只是决定在自定义任务中执行此操作,而不是仅在 xml 中执行。我确保项目中包含 3 个文件,FilePath、BinPath 和 HooksPath。如果他们都在那里,什么也不会发生。如果缺少一个,则将其添加到 ItemGroup 并保存文档。文档保存不能在构建期间发生。因此它需要在任何保存后再次运行构建。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Xml.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace BuildTasks
{
public class AddFilesToProject : Task
{
[Required]
public string ProjectPath { get; set; }

[Required]
public string FilePath { get; set; }

[Required]
public string BinPath { get; set; }

[Required]
public string HooksPath { get; set; }

[Required]
public string ProjectDir { get; set; }


/// <summary>
/// When overridden in a derived class, executes the task.
/// </summary>
/// <returns>
/// true if the task successfully executed; otherwise, false.
/// </returns>
public override bool Execute()
{

try
{
var binRelative = BinPath.Replace(ProjectDir + "\\", "");
var hooksRelative = HooksPath.Replace(ProjectDir + "\\", "");
var fileRelative = FilePath.Replace(ProjectDir + "\\", "");
XDocument document = XDocument.Load(ProjectPath);
XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";

bool foundBin = false;
bool foundHooks = false;
bool foundFile = false;
XElement itemGroup = null;
foreach (XElement el in document.Descendants(ns + "ItemGroup"))
{
foreach (XElement item in el.Descendants(ns + "Compile"))
{
itemGroup = el;
if (item.Attribute("Include").Value.Contains(binRelative))
{
foundBin = true;
Log.LogMessage(MessageImportance.Low, "FoundBin: {0}", foundBin);
}
else if (item.Attribute("Include").Value.Contains(hooksRelative))
{
foundHooks = true;
Log.LogMessage(MessageImportance.Low, "FoundHooks: {0}", foundHooks);
}
else if (item.Attribute("Include").Value.Contains(fileRelative))
{
foundFile = true;
Log.LogMessage(MessageImportance.Low, "FoundFile: {0}", foundFile);
}
}
}

if (!foundBin)
{
XElement item = new XElement(ns + "Compile");
item.SetAttributeValue("Include", binRelative);
if (itemGroup != null) itemGroup.Add(item);
}
if (!foundHooks)
{
XElement item = new XElement(ns + "Compile");
item.SetAttributeValue("Include", hooksRelative);
if (itemGroup != null) itemGroup.Add(item);
}
if (!foundFile)
{
XElement item = new XElement(ns + "Compile");
item.SetAttributeValue("Include", fileRelative);
if (itemGroup != null) itemGroup.Add(item);
}
if (!foundBin || !foundHooks || !foundFile)
{
document.Save(ProjectPath);
}
}
catch (Exception e)
{
Log.LogErrorFromException(e);
}

return !Log.HasLoggedErrors;
}
}
}

关于c# - 将 MSBuild 生成的文件添加到 Visual Studio 解决方案资源管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19255816/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com