【问题标题】:Visual Studio project with a custom build step only (no default build)仅具有自定义构建步骤的 Visual Studio 项目(无默认构建)
【发布时间】:2020-11-24 17:26:43
【问题描述】:

我想创建一个 Visual Studio 项目,它可以让我看到一堆 JavaScript 和其他文件并正常编辑它们,但也有一个构建步骤可以运行我想要的任何自定义命令(目前是一些 npm 命令,以后可能更多)。基本上我想要结合 3 个功能:

  1. 能够像任何 VS 项目(C#、C++ 等)一样浏览和编辑文件
  2. 能够通过在 Visual Studio 中选择“构建”来运行自定义构建步骤(包括构建整个解决方案)。
  3. 能够从命令行 (MSBuild) 运行相同的自定义构建步骤。

使用“共享项目”(.shproj) 可以让我轻松查看和编辑文件,但上下文菜单中没有 Build 项,即使我手动添加了 Build 目标:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Label="Globals">
    <ProjectGuid>...</ProjectGuid>
  </PropertyGroup>

  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.props" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets" />

  <Import Project="MyItems.projitems" Label="Shared" />

  <PropertyGroup>
    <Configuration>Debug</Configuration>
    <Platform>Any CPU</Platform>
  </PropertyGroup>

  <Target Name="Build">
    <Exec Command="ECHO My custom build!" />
  </Target>  
</Project>

我也尝试过使用精简的 VC++ 项目(因为我实际上并不想运行 C++ 编译器),这允许从 VS 运行构建,但打开项目会记录警告,如 error MSB4057: The target "GetProjectDirectories" does not exist in the project.并尝试将文件添加到失败并出现该错误或类似错误。

一定有更简单的方法来做到这一点!

【问题讨论】:

  • 你希望你的项目是什么,一个纯node.js控制台项目还是一个js web项目,一个c#核心编译器项目?您应该告诉我们其他文件的类型。在 VS IDE(按钮)中构建项目应该明确项目的类型。此外,如果要构建整个项目,则应明确项目最终将生成的类型。在 VS IDE 中使用 Build Button 并不是一件简单的事情。
  • 并且不确定如何修改导致错误的 c++ vcxproj 文件。此外,按钮菜单来自xxx.proj文件上MSBuild文件夹相关项目类型文件夹中的import targets="xxx\xxx.xxx"系统默认文件。因此,您应该确定最终要生成的项目的类型。不同类型的项目有不同的导入文件。有了它们,您就可以通过导入的 VS 构建文件在 VS IDE 中使用 Build Button。

标签: visual-studio msbuild


【解决方案1】:

从你目前的描述来看,我认为你想在 VS IDE 中创建一个 js 项目。

然而,VS IDE 默认有node js project template。并且你应该在VS_Installer下安装工作负载Node.js开发,这样你就可以使用了。

之后,你就可以创建这样的项目了。

1) 添加js文件或者其他文件通过右键项目-->添加-->Existing Item这样您可以在 VS IDE 上修改文件。

2)如果要执行不破坏整个构建的自定义构建步骤,则应使自定义目标依赖于默认构建。

你可以用这个:

<Target Name="CustomStep" AfterTargets="Build">
  <Exec Command="ECHO My custom build!" />
</Target>

<Target Name="CustomStep" BeforeTargets="Build">
  <Exec Command="ECHO My custom build!" />
</Target>

注意:如果你使用

<Target Name="Build">
    <Exec Command="ECHO My custom build!" />
  </Target>  

它将覆盖系统构建过程,而是运行命令,这会破坏整个默认构建。

3) 如果要在 msbuild 命令上执行自定义构建,则应指定自定义目标的名称:

msbuild xxx\xxx.proj -t: CustomStep(the name of the custom target)

================================================

此外,如果您仍想使用C++项目模板,您可以创建一个不包含任何clcompile文件的空c++项目,然后执行相同的步骤。

如果您不想使用 C++ 编译器,您应该只删除 vcxproj 文件中的任何 xml 节点,如下所示:

 <ClCompile Include="xxx.cpp" />
 <ClInclude Include="xxx.h" />

您使用空的 C++ 项目时,您不必担心。

==========================================

更新 1

如果你想在没有VS IDE的构建服务器上构建这个项目,我建议你可以安装Build Tool for VS2019,它是一个独立的、轻量级的构建命令行(相当于dotnet cli)。

Build Tool for VS2019

所有下载-->Visual Studio 2019 工具--> Visual Studio 2019 构建工具

然后,你必须安装相关的构建工作负载,例如Node.js构建工具,然后我们可以使用命令行构建node.js项目服务器。

整个安装过程很快。

【讨论】:

  • 谢谢,Node.js 项目运行良好(即使我的项目不是 Node.js 项目)。我能够添加自定义构建步骤。
  • 感谢您的反馈。我认为我的回答确实有帮助。如果我的回答能帮助您更好地处理和理解问题,请不要忘记接受。如果您有任何其他问题,请随时告诉我们:)
  • 谢谢,我还有其他顾虑:我需要这个项目也可以从命令行构建(理想情况下通过运行dotnet build,但也可以使用 msbuild 命令) '没有安装 Visual Studio。为此使用 Node.js 项目仍然是一种解决方法,而不是我一直在寻找的:一个只是可以在 VS 中编辑并使用我的自定义构建构建的文件集合的项目进入 VS 和命令行。
  • dotnet build 用于构建 new-sdk 项目(net core 和 net standard)。除非您创建一个新模板 net core 项目,否则将您的内容文件直接添加到项目中,然后编写您的按照我的步骤2、3自定义构建步骤,因为你使用的是默认的net core项目,只要不Move任何关于xxx.cs的文件,就不会出现问题。所以你可以使用dotnet build
  • 然而,vs 有一个独立的、轻量级的构建工具,相当于dotnet cli。您必须下载 VS2019 的构建工具。请参阅我的更新答案。它就像一个独立的命令行,可以构建具有相关构建工作量的 node js 项目。然后,使用msbuild xxx.xxx.njsproj -t:build。所以你不必担心这一点。有很多解决方案可以满足您的要求:)
【解决方案2】:

受 Perry Qian-MSFT 回答的启发,我设法将 Node.js 项目精简到我需要让 Visual Studio 加载和构建它的最低限度,但没有引用任何外部文件。

主要技巧是VS需要定义一个名为“CoreCompile”的目标来显示Build菜单项! (它还需要一个“构建”目标,但这个目标更明显。)

我的项目现在看起来像这样:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>(some guid)</ProjectGuid>
    <ProjectHome>.</ProjectHome>
    <ProjectTypeGuids>{3AF33F2E-1136-4D97-BBB7-1795711AC8B8};{9092AA53-FB77-4645-B42D-1CCCA6BD08BD}</ProjectTypeGuids>
  </PropertyGroup>

  <!-- These property groups can be empty, but need to be defined for VS -->
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
  </PropertyGroup>

  <Import Project="My.Build.targets" />
  
  <!-- Define empty standard MSBuild targets, since this project doesn't have them. Doing it this way allows My.Build.targets to also be used in a project that does define them. -->
  <Target Name="Build" />
  <Target Name="ReBuild" />
  <Target Name="Clean" />
  <!-- NOTE: a target named "CoreCompile" is needed for VS to display the Build menu item. -->
  <Target Name="CoreCompile" />

  <!-- Files shown in Visual Studio - adding and removing these in the UI works as expected -->
  <ItemGroup>
    <Content Include="myfile..." />
  </ItemGroup>
</Project>

My.Build.targets 看起来像这样:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="MyBuild" AfterTargets="Build">(build steps)</Target>
  <Target Name="MyReBuild" AfterTargets="ReBuild">(re-build steps)</Target>
  <Target Name="MyClean" AfterTargets="Clean">(clean steps)</Target>

  <!-- This target is needed just to suppress "warning NU1503: Skipping restore for project '...'. The project file may be invalid or missing targets
  required for restore." -->
  <Target Name="_IsProjectRestoreSupported" Returns="@(_ValidProjectsForRestore)">
    <ItemGroup>
      <_ValidProjectsForRestore Include="$(MSBuildProjectFullPath)" />
    </ItemGroup>
  </Target>
</Project>

【讨论】:

  • 既然您有解决方法,我建议您可以标记自己的答案,以便帮助其他社区成员搜索和处理类似问题。无论如何,祝你有美好的一天!
  • @PerryQian-MSFT 你知道我需要什么 MSBuild 目标才能让 VS2019 运行(“开始”/“不调试就开始”)我的自定义项目吗?现在它给出了这个错误:“请通过右键单击解决方案资源管理器中的文件并选择'设置为 Node.js 启动文件'或通过修改项目属性中的配置来选择要启动的启动文件”。我尝试了一个名为“Run”的目标,但没有成功。
猜你喜欢
  • 2012-02-22
  • 2022-08-23
  • 2011-04-10
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
相关资源
最近更新 更多