假设我向一个 csproj 文件添加了一个自定义目标,有没有办法从 Visual Studio 中运行该目标?我不想将其作为预构建或后构建步骤,我只想能够从 Visual Studio 运行此目标(及其依赖项)。
Suppose 我在一个 csproj 文件中添加了一个自定义目标。是否有一种方法可以从 Visual Studio 中运行该目标?我不想将其设置为预先构建或后构建步骤,我只想能够从 Visual Studio 运行此目标(以及它的依赖项)。假设我向一个 csproj 文件添加了一个自定义目标,有没有办法从 Visual Studio 中运行该目标?我不想将其作为预构建或后构建步骤,我只想能够从 Visual Studio 运行此目标(及其依赖项)。
Suppose 我在一个 csproj 文件中添加了一个自定义目标。是否有一种方法可以从 Visual Studio 中运行该目标?我不想将其设置为预先构建或后构建步骤,我只想能够从 Visual Studio 运行此目标(以及它的依赖项)。有一种简单的方法(虽然不是完全令人满意),可以使用自定义外部工具。
假设您的项目文件进行了以下修改:
<Target Name="CalledFromIde">
<Error Text="Called from the IDE!" />
</Target>
进入“工具” | “外部工具”,并添加一个如下所示的工具:
Title: Called from IDE
Command: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
Arguments: $(ProjectDir)$(ProjectFileName) /t:CalledFromIde
Initial directory: $(ProjectDir)
Use Output window: checked
Build FAILED.
"F:\Code\CsProject\CsProject.csproj" (CalledFromIde target) (1) ->
(CalledFromIde target) ->
F:\Code\CsProject\CsProject.csproj(57,5): error : Called from the IDE!
public void Exec(
string commandName,
vsCommandExecOption executeOption,
ref object varIn,
ref object varOut,
ref bool handled)
{
handled = false;
if (executeOption != vsCommandExecOption.vsCommandExecOptionDoDefault)
return;
if (commandName != "BuildAddin.Connect.BuildAddin")
return;
var doc = _applicationObject.ActiveDocument;
var projectItem = doc.ProjectItem;
var project = projectItem.ContainingProject;
var evalProject =
Microsoft.Build.Evaluation.ProjectCollection
.GlobalProjectCollection.LoadProject(project.FullName);
var execProject = evalProject.CreateProjectInstance();
bool success = execProject.Build("CalledFromIde", null);
var window = _applicationObject.Windows.Item(Constants.vsWindowKindOutput);
var output = (OutputWindow)window.Object;
OutputWindowPane pane = output.OutputWindowPanes.Add("BuildAddin");
pane.OutputString(success ? "built /t:CalledFromIde" : "build failed");
handled = true;
return;
}
5) 在调试时使用更好的自定义目标,因为先前的目标存在错误:
<Target Name="CalledFromIde">
<WriteLinesToFile File="CalledFromIde.txt" Lines="Called from the IDE!" />
</Target>
6) 上述代码为了简洁起见没有进行错误检查,但在IDE中运行时,您需要更加规范。插件将在“工具”菜单上放置一个菜单项。如上所述,它只是查找包含当前活动编辑器文档的项目,如果您正在构建某些内容,则需要进行更好的管道连接。
此技术从IDE内部获取构建引擎实例,并让其在项目的另一个实例上执行构建。
如果您在Visual Studio内运行构建,则会有一个名为VisualStudioDir的构建变量。
要仅在VS构建会话中执行此操作,请执行以下操作:
<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' != ''>
</Target>
如果要在Visual Studio之外的构建中执行,请按照以下步骤操作:
<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' == ''>
</Target>
Edit you project file to include your custom targets file by adding an import
<Imports Project="CustomBuildTasks.Targets"><Imports/>
DefaultTargets="Build"
属性更改为自定义目标,例如"All"
,如下所示:DefaultTargets="All"
"<Target Name="All" DependsOnTargets="ZipOutputFiles;Build">
</Target>"
"All"
目标中输出zip文件。不久前,我遇到了同样的问题,并决定编写VS插件来解决它。试试这个:
https://github.com/Serg046/MsBuildTaskExplorer
https://marketplace.visualstudio.com/items?itemName=saaseev.MsBuildTaskExplorer