天道酬勤,学无止境

在 Visual Studio 中的 MSBuild Community Tasks BeforeBuild 步骤期间,在路径中找不到 xsd.exe(Can't find xsd.exe in the path during MSBuild Community Tasks BeforeBuild step in Visual Studio)

问题

我正在使用 MSBuild 社区任务运行 Xsd.exe 作为我在 Visual Studio 中构建的一部分,如下所示:

<Import Project="$(SolutionDir)Common.targets" />
<PropertyGroup>
  <MSBuildCommunityTasksPath>$(SolutionDir)TeamBuildTypes</MSBuildCommunityTasksPath>
</PropertyGroup>
<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" />
<UsingTask TaskName="XSD" AssemblyFile="$(VCTargetsPath)$(CPPTasks)" />
<Target Name="BeforeBuild">
  <!--Exec Command="'$(DevEnvDir)..\Tools\vsvars32.bat'" /-->
  <XSD Sources="MySchema.xsd" GenerateFromSchema="classes" Language="CS" />
</Target>

Common.targets是按照这里。

但是,我在构建过程中收到以下错误:

“XSD”任务意外失败。

Microsoft.Build.Shared.InternalErrorException:MSB0001:内部 MSBuild 错误:xsd.exe 意外地不是根路径

MSDN论坛这里已经给出了解决方案,就是在path环境变量中添加xsd.exe路径。 但是,正如 Pico Ohms 的回答所示,这是不可维护的,因为它依赖于版本并且需要每个开发人员执行额外的步骤才能构建,仅仅因为 Xsd.exe。

我在这里找到了另一个解决方案,即预先调用vsvars32.bat 。 这是上面代码中注释掉的行。 这行不通,所以我在这里找到了一个我希望能让它起作用的解决方案,即使用/useenv参数调用DEVENV

然后我在这里找到了另一个解决方案,即添加<xs:include schemaLocation="MSBuild\MSBuild.Community.Tasks.xsd"/>Microsoft.Build.xsd 。 也没有用。

所以,现在我没有想法了。 如何通过使用/useenv解决方案或其他解决方案,在不需要开发人员更新其路径变量的情况下使 MSBuild Community Tasks XSD 任务正常工作? 我知道我可以将xsd.exe放在 Visual Studio 解决方案中,但这对我来说似乎是一种廉价的解决方法。

回答1

我不得不做一些研究来记住我在另一个线程上发布的关于此的评论,但是您可以通过从 XSD 任务派生并覆盖 GenerateFullPathToTool() 方法来为您的任务实现自定义搜索路径。

当您查看 DotPeek 中的 XSD 任务时,您可以看到它派生自 Microsoft.Build.Utilities.ToolTask​​。 ToolTask​​ 包含一个名为“GenerateFullPathToTool()”的方法。 调用此方法以返回工具的完整路径,顾名思义。

Microsoft.Build.Utilities 类中的 ToolLocationHelper 可用于为已安装的 xsd.exe 找到合适的位置。

它包含一个名为 GetPathToDotNetFrameworkSdkFile 的方法,该方法将为您提供 dot net sdk 的 fileName 位置。 将“xsd.exe”作为参数,你应该很高兴。

如果该方法不返回您需要的路径,则还有其他方法可以返回各种路径及其基于注册表的方法,因此它比设置显式路径更具可移植性。

回答2

我多年来一直使用的解决方案是使用内联任务来设置项目文件中的路径。

 <ItemGroup>   
    <!-- Configure XSD files by using the XsdClasses custom item type.  All files of this type are converted by the GenerateXsdClasses target. --> 
    <XsdClasses Include="Data\XsdFile1.xsd">
      <SubType>Designer</SubType>
    </XsdClasses>
     <XsdClasses Include="Data\XsdFile2.xsd">
      <SubType>Designer</SubType>
    </XsdClasses>
  </ItemGroup>


  <!-- In-line task to add a folder to the current path if not already in it. -->
  <UsingTask TaskName="AddToPath" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
      <FolderPath ParameterType="System.String" Required="true" />
    </ParameterGroup>

    <Task>
      <Code Type="Fragment" Language="c#"><![CDATA[
            const string PathEnvironmentVariableName = "PATH";
            string currentPath = Environment.GetEnvironmentVariable(PathEnvironmentVariableName);
            if(!currentPath.ToLower().Contains(FolderPath.ToLower()))
            {
                currentPath = currentPath.TrimEnd(';');
                string newPath = string.Format("{0};{1}", currentPath, FolderPath);
                Environment.SetEnvironmentVariable(PathEnvironmentVariableName, newPath);
            }
]]></Code>
    </Task>   
  </UsingTask>

  <!-- Reference the Xsd task. -->
  <UsingTask TaskName="XSD" AssemblyFile="$(VCTargetsPath)Microsoft.Build.CppTasks.Common.dll" />

  <!-- Set the default path to Xsd.exe - this will be added to the current path using the above inline task.  Can be overridden per client by setting a user or machine environment variable with the same name. -->
  <PropertyGroup>
    <NetFxToolsPath Condition="'$(NetFxToolsPath)' == ''">C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7 Tools\</NetFxToolsPath>
  </PropertyGroup>


  <!-- Generate classes from xsd files configured with 'XsdClasses' item type. -->
  <Target Name="GenerateXsdClasses" Inputs="@(XsdClasses)" Outputs="@(XsdClasses->'%(RelativeDir)%(Filename).cs')">
    <Message Importance="high" Text="Building %(XsdClasses.Filename)" />
    <AddToPath FolderPath="$(NetFxToolsPath)" />
    <!-- Note the trailing . in the outputdir because the folder ends with a / -->
    <XSD MinimalRebuildFromTracking="true" Sources="%(XsdClasses.Identity)" GenerateFromSchema="classes" Namespace="XsdClassesNamespace" SuppressStartupBanner="true" AdditionalOptions="/outputdir:&quot;%(XsdClasses.RelativeDir).&quot;" />
  </Target>

  <!-- Configure class generation from xsd to occur before build. -->
  <Target Name="BeforeBuild" DependsOnTargets="GenerateXsdClasses"/>

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何使用 AssemblyInfoTask 更改程序集版本号?(How to change Assembly Version Number using AssemblyInfoTask?)
    问题 我试图自动化为所有 DLL 设置版本的过程,在花了一些时间之后,我开始了解最有可能实现它的AssemblyInfo任务。 所以我继续安装它,特别是版本1.0.51130.0 。 安装后,我在.cspoj文件中手动添加了AssemblyInfoTask的Import Tag(通过卸载每个项目)(该解决方案有超过35个proj文件)。 <Import Project="$(MSBuildExtensionsPath)\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.Targets"/> 接下来我修改了将安装在路径中的Microsoft.VersionNUmber.Target文件: C:\Program Files\MSBuild\Microsoft\AssemblyInfoTask ,我修改了以下部分: <!-- Properties for controlling the Assembly Version --> <PropertyGroup> <AssemblyMajorVersion>4</AssemblyMajorVersion> <AssemblyMinorVersion>0</AssemblyMinorVersion> <AssemblyBuildNumber></AssemblyBuildNumber>
  • Can't find xsd.exe in the path during MSBuild Community Tasks BeforeBuild step in Visual Studio
    I am using MSBuild Community Tasks to run Xsd.exe as part of my build in Visual Studio as thus: <Import Project="$(SolutionDir)Common.targets" /> <PropertyGroup> <MSBuildCommunityTasksPath>$(SolutionDir)TeamBuildTypes</MSBuildCommunityTasksPath> </PropertyGroup> <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" /> <UsingTask TaskName="XSD" AssemblyFile="$(VCTargetsPath)$(CPPTasks)" /> <Target Name="BeforeBuild"> <!--Exec Command="'$(DevEnvDir)..\Tools\vsvars32.bat'" /--> <XSD Sources="MySchema.xsd" GenerateFromSchema="classes" Language="CS" /> </Target> Common
  • NuGet 在构建开始前恢复 PostSharp 包(NuGet restoring PostSharp package before the build begins)
    问题 我正在使用 PostSharp 并且我的项目文件中有以下目标描述: <Target Name="EnsurePostSharpImported" BeforeTargets="BeforeBuild" Condition="'$(PostSharp30Imported)' == ''"> <Error Condition="!Exists('..\..\packages\PostSharp.3.1.33\tools\PostSharp.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://www.postsharp.net/links/nuget-restore." /> <Error Condition="Exists('..\..\packages\PostSharp.3.1.33\tools\PostSharp.targets')" Text="The build restored NuGet packages. Build the project again to include
  • 如何在内置的Visual Studio调试器服务器中使用Web.debug.config?(How can I use Web.debug.config in the built-in visual studio debugger server?)
    问题 如何在Visual Studio 2010内置调试器中合并和利用Web.debug.config ? 回答1 这是一个已知的错误。 该功能现在只能在部署过程中使用。 https://connect.microsoft.com/VisualStudio/feedback/details/523221/have-web-debug-config-apply-during-development 如果您也遇到此问题,请对其进行投票,因此将尽快修复。 回答2 这实际上很简单,并且不管您信不信,似乎这就是VS设计的工作方式。 在包含web.config的项目的.csproj文件的关闭“ Project”标记之前,逐字添加以下行。 <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" /> <Target Name="Transform"> <MakeDir Directories="obj\$(Configuration)" Condition="!Exists('obj\$(Configuration)')" />
  • MSBuild BeforeBuild 步骤(MSBuild BeforeBuild Step)
    问题 我昨天询问了让AfterBuild工作的问题,并且能够通过将它放在“ Project部分的最底部来使其Project :MSBuild AfterBuild Step 我在不同的项目中尝试了完全相同的事情。 这是我的BeforeBuild代码: <Target Name="BeforeBuild"> <Message Text="###HI###" Importance="High" /> </Target> 我在项目中的Target Name="BeforeBuild"之前没有另一个,我把它放在Project部分的最底部。 .vcxproj 可以毫无问题地解析/加载到 Visual Studio 2010 中。 我将“MSBuild 项目构建输出/日志详细信息”设置为“正常”。 还有其他我没有想到的事情会导致它无法运行吗? 回答1 除非明确调用,否则不会调用目标,它是默认目标,在被调用的目标的 DependsOn 中声明或声明其自己的 BeforeTargets 或 AfterTargets 并且这些目标之一被调用。 因此,如果您希望在名为“InitializeBuildStatus”的目标之前调用目标,则可以这样编写: <Target Name="MyBeforeBuild" BeforeTargets="InitializeBuildStatus"> <Message
  • 将 MSBuild 集成到 Visual Studio(Integrating MSBuild into Visual Studio)
    问题 我是一名独立开发人员,运行 Visual Studio 2008 并研究 MSBuild 以改进我的构建过程。 到目前为止,我发现的几乎所有教程都有大量关于编写构建文件的信息。 但是,我在找出如何将 MSBuild 集成到 Visual Studio 时遇到了很多麻烦。 也许 MSBuild 只与 CruiseControl 之类的东西一起使用,但作为一个开发人员,这对我来说太过分了。 构建文件应该在 Visual Studio 项目中的哪个位置,我如何从 IDE 中运行它? 回答1 Visual Studio 会为其支持的项目自动执行 MSBuild。 如果右键单击一个项目并将其卸载,则可以在 Visual Studio 中对其进行编辑。 重新加载(再次右键单击项目),强制(重新)构建以测试您的更改。 另一种方法是在外部编辑器中编辑项目文件,Visual Studio 将检测保存并提供为您重新加载项目。 听起来您走在正确的轨道上,如果您正在考虑编写目标或自定义 MSBuild 任务,请花时间将它们与您当前的项目分开,以便您可以重用它们。 不过不要重新发明轮子,两个主要的互补 MSBuild 项目是 MSBuild Community Tasks 和 MSBuild Extension Pack。 更新:从您对 Mitch 回答的评论来看
  • NuGet自动软件包还原不适用于MSBuild(NuGet auto package restore does not work with MSBuild)
    问题 我正在尝试使用MSBuild 12.0构建一个缺少packages内容的解决方案(内部的repositories.config除外)。 我希望它可以在构建之前自动还原所有丢失的软件包,但事实并非如此-MsBuild报告大量错误: “您是否缺少using指令或程序集引用?” NuGet Manager是2.7(我在Visual Studio 2013的“关于”框中看到了此信息)。 我什至尝试传递EnableNuGetPackageRestore=true参数-祝您好运。 我想念什么? 回答1 自v3.3.0起更新了最新的官方NuGet文档 包还原方法 NuGet提供了三种使用软件包还原的方法。 自动打包还原是NuGet团队推荐的在Visual Studio中进行打包还原的方法,它是在NuGet 2.7中引入的。 从NuGet 2.7开始,NuGet Visual Studio扩展集成到Visual Studio的生成事件中,并在生成开始时恢复丢失的包。 默认情况下启用此功能,但是开发人员可以根据需要选择退出。 运作方式如下: 在项目或解决方案构建中,Visual Studio引发一个事件,表明在解决方案中开始构建。 NuGet响应此事件,并检查解决方案中包含的packages.config文件。 对于找到的每个packages.config文件,将枚举其软件包
  • 本地化 AssemblyInfo.cs(Localize AssemblyInfo.cs)
    问题 我的 AssemblyInfo 包含有关我的产品、公司等的信息。这些数据目前硬编码在 cs 文件中: [assembly: AssemblyCompany("My Company.")] [assembly: AssemblyProduct("MyProduct")] [assembly: AssemblyCopyright("Copyright © 2012 My Company, Inc. All Rights Reserved.")] [assembly: AssemblyTrademark("MyProduct is a trademark of MyCompany Software.")] [assembly: AssemblyCulture("")] 我想本地化这些文本,但我无法执行以下操作: [assembly: AssemblyCompany(Resources.MyConpany)] 有没有解决的办法 ? 回答1 是的,这是可能的。 这些属性本身很少被关心语言的人阅读。 然而,C# 编译器也使用它们来生成 /win32res 编译选项的默认版本。 这会影响您在资源管理器中查看程序集属性时看到的内容,使用“属性”快捷菜单项并查看“详细信息”选项卡。 Windows 在这里显示的不是程序集属性,它对托管程序集一无所知。
  • 如何通过我们的CI平台(哈德森)自动递增C#程序集版本?(How can I auto increment the C# assembly version via our CI platform (Hudson)?)
    问题 我本人和我的小组在增加程序集版本号时都感到非常恐惧,我们经常以1.0.0.0版本发布程序集。 显然,这会引起很多头痛。 通过我们的CI平台,我们的做法越来越好,我真的想将其设置为自动递增assemblyinfo.cs文件中的值,以便我们的程序集版本会随着代码更改而自动更新。那个集会。 我之前曾设置过(在找到Hudson之前)通过msbuild或命令行(不记得了)来增加值的方法,但是有了Hudson,它将更新SVN存储库并触发ANOTHER构建。 当Hudson每小时轮询SVN时,这将导致缓慢的无限循环。 让Hudson增加版本号是个坏主意吗? 什么是替代方法呢? 理想情况下,我的解决方案标准是: 生成之前,在assemblyinfo.cs增加生成号仅增加已更改的部件中的内部版本号。 这可能是不可能的,因为Hudson每次进行构建时都会擦除项目文件夹将更改后的assemblyinfo.cs提交到代码存储库(当前为VisualSVN) 不会导致Hudson在下次扫描更改时触发新的构建 在脑海中解决这个问题,我可以很容易地通过批处理文件/命令提出解决方案,但是我的所有想法都会导致Hudson在下次扫描时触发新的构建。 我并不是在寻找某人为我做任何事情,只是为我指明了正确的方向,也许是让哈德森忽略某些SVN提交的技术,等等。 到目前为止,我发现的所有内容仅是一篇文章
  • 使用Visual Studio时可以自动增加文件生成版本吗?(Can I automatically increment the file build version when using Visual Studio?)
    问题 我只是想知道如何使用Visual Studio(2005)自动增加文件的生成(和版本?)。 如果我查找说C:\Windows\notepad.exe的属性,则“版本”选项卡将显示“文件版本:5.1.2600.2180”。 我也想在我的dll版本中获得这些很酷的数字,而不是1.0.0.0版本,这让我们面对了它有些沉闷。 我尝试了一些方法,但是它似乎并不是开箱即用的功能,或者也许我只是在错误的地方(通常)。 我主要处理网络项目。 我看了两个: http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx http://www.codeproject.com/KB/dotnet/build_versioning.aspx 而且我不敢相信做某件事会花费很多精力,这是标准做法。 编辑:据我所知,它在VS2005中不起作用(http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx) 回答1 在visual Studio 2008中,以下工作。 找到AssemblyInfo.cs文件并找到以下两行: [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0"
  • 参考DLL文件未复制到部署项目的bin中,从而导致错误(Reference DLL file not copying to bin with deployment project, causing error)
    问题 我们的Web应用程序项目中引用了几个外部DLL文件。 我们有一个用于在托管服务器上安装的部署项目。 当我们使用.NET 3.5和Visual Studio 2008时,DLL文件被复制到bin文件夹中。 由于我们已经升级到.NET 4和Visual Studio 2010,因此不再发生这种情况,并且由于找不到引用,因此发生服务器错误。 CopyLocal设置为true,并且在web.config中找不到任何内容,这表明在其他位置进行了设置。 回答1 Visual Studio 2010中存在一个错误。默认情况下,解决方案文件中的XML如下所示: <Reference Include="DevExpress.SpellChecker.v11.1.Core, Version=11.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL"> <HintPath>..\References\DevExpress.SpellChecker.v11.1.Core.dll</HintPath> </Reference> MSBuild在下面期望这样做,因此DLL文件将包含在部署中: <Reference Include="DevExpress.SpellChecker.v11.1
  • 如何防止在项目构建期间缓存外部 MSBuild 文件(由 Visual Studio)?(How can I prevent external MSBuild files from being cached (by Visual Studio) during a project build?)
    问题 我的解决方案中有一个项目,它最初是一个 C# 库项目。 就代码而言,它对它没有任何兴趣,它只是在我的解决方案中用作其他项目的依赖项,以确保首先构建它。 构建此项目的副作用之一是创建了一个共享的 AssemblyInfo.cs,其中包含其他项目使用的版本号。 我通过将以下内容添加到 .csproj 文件来完成此操作: <ItemGroup> <None Include="Properties\AssemblyInfo.Shared.cs.in" /> <Compile Include="Properties\AssemblyInfo.Shared.cs" /> <None Include="VersionInfo.targets" /> </ItemGroup> <Import Project="$(ProjectDir)VersionInfo.targets" /> <Target Name="BeforeBuild" DependsOnTargets="UpdateSharedAssemblyInfo" /> 引用的文件 VersionInfo.targets 包含以下内容: <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer
  • Visual Studio 2008 Post Build 事件 — 仅在重建时运行(Visual Studio 2008 Post Build event — only run on Rebuild)
    问题 在 Visual Studio 2008 中,我们运行一个构建后事件,该事件调用 NANT 并依次创建我们的配置文件。 例如 if $(SolutionDir) == . GOTO end nant -buildfile:$(SolutionDir)default.build create..web.config 有没有办法只在 ReBuild 上运行它? 回答1 我认为您可以通过指定构建目标而不是使用构建事件来做到这一点。 尝试创建 AfterClean 目标以删除生成的配置文件,并创建 BeforeBuild 目标以创建它们。 确保为 BeforeBuild 目标设置文件依赖项,以便 msbuild 知道它应该只在文件不存在时运行该步骤。 我还没有真正尝试过这个,但我相信 msbuild 只会在目标文件不存在的情况下运行目标。 重建时,将调用清理过程,并依次调用 AfterClean 目标。 您可以在此处阅读有关构建目标的更多信息。 使用构建目标而不是事件的唯一真正缺点是它们在 VS UI 中的任何地方都不可见 - 只有在检查项目文件时才能找到它们。 可能有涉及事件的更直接的解决方案 - 在这里查看 msbuild 团队博客。
  • Visual Studio 是否支持向项目添加 MSBuild 任务?(Does Visual Studio support adding MSBuild tasks to projects?)
    问题 我正在尝试将一些简单的 MSBuild 任务添加到 Visual Studio 项目 (VS 2012 Express) - 具体来说,创建一个子目录,然后将一些文件复制到准备打包的输出目录的子目录中。 我看到 VS 支持自定义构建步骤,它们是命令行调用。 但是,由于 VS 基于 MSBuild,因此应该可以将这些直接添加为 MSBuild 任务,例如 AfterBuild 预定义目标中的 Copy Task。 我找不到任何在 Visual Studio 框架内实际添加此类任务的方法。 该文档仅从 MSBuild 的角度讨论它,而不是它如何在 Visual Studio 的 UI 中工作。 它似乎也没有讨论在那里引用构建输出等的属性; 大概它们只是 msbuild 自己使用的那些。 Visual Studio 的 UI 中是否支持 MSBuild 任务管理,并且它只是从我的 Express 版本中删除了? 或者我是否必须破解项目文件 XML 才能添加 MSBuild 任务? 这是否受支持以及它应该以何种方式完成? 我习惯于使用 Eclipse 和 Ant 或 Maven,这些都在 IDE 中得到支持,当然您可以直接破解 XML。 在 Visual Studio 中根本找不到用于 MSBuild 任务管理的 UI 非常令人困惑。 使用免费赠品版我是否遗漏了明显的或残缺的?
  • 生成期间未将 NuGet 包文件复制到项目内容(NuGet package files not being copied to project content during build)
    问题 我正在使用 VS2012 Professional 和 NuGet Package Manager 版本 2.2.31210 构建一个 MVC4 Web 应用程序。 我的解决方案中有多个项目,所有项目都共享我使用 NuGet 安装的各种包。 我的一个项目是一个 MVC4 Web 应用程序,我在其中使用了 bootstrap、jquery UI 等包,所有这些包都是使用 NuGet 安装的。 当我从我的存储库克隆我的整个解决方案的新副本并构建我的 MVC4 项目时,包恢复功能似乎正在工作:它在解决方案目录下创建包目录并填充它我希望的包的所有版本看。 但是,内容文件不会复制到 MVC 应用程序目录中的适当位置。 奇怪的是它确实为内容创建了目录,但不复制内容文件本身。 例如,我正在使用出现在包/Twitter.Bootstrap.2.2.2 中的 Twitter Bootstrap 包。 在 MVC 项目中,在 Content 目录中创建了一个名为 bootstrap 的目录(包含 css、img 和 js 目录)。 但是,没有 css 或 js 文件被复制到这些目录中! 有没有人知道我必须说出什么魔法咒语才能让构建从 NuGet 包目录复制这些内容文件? 回答1 这是我们所有人都面临的一个非常普遍的问题。 我已经创建了一个 MSBuild
  • 如何在 Wix Toolset Bootstrapper 中读取文本文件的内容(How to read content of text file in Wix Toolset Bootstrapper)
    问题 我正在使用 WiX 工具集来构建安装程序,我想从文本文件中读取版本。 文本文件位于 mybootstrapper 中,如下所示: 下面是我想读取文本文件内容的代码 <Bundle IconSourceFile='product.ico' Name="Retail Grip" Version="Version.txt" <!-- i know this is not correct --> Manufacturer="Company Name" UpgradeCode="PUT-GUID-HERE"> 回答1 哦,这是一个 WiX 捆绑包 - 那是“ Wax ”? 我听说它是​​某种 WiX 工具? 我不确定它是如何工作的(该链接中的页面截图)。 可能在使用的时候编译器变量的使用有限制? 我在看到那个Wax 文件之前写了下面的内容,我认为你有一个普通的 WiX 源而不是一个包源。 无论哪种方式,让我添加我写的内容,看看是否有帮助。 相似之处。 另外:Neil Sleightholm 的 WiX Burn 模板(朝上)。 请先旋转该链接。 在常规 WiX 文件中,您可以使用预处理器变量: $(var.CurrentVersion) (编译器变量)。 像这样的东西: <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <
  • roslyn 编译器未使用 msbuild 复制到 AspnetCompileMerge 文件夹(roslyn compiler not copied to AspnetCompileMerge folder using msbuild)
    问题 我有一个 .NET MVC 项目,我正在尝试使用 Jenkins 进行部署。 我一直让 Jenkins 运行 msbuild,然后使用 RoboCopy 复制生成的文件。 我想切换到只使用发布配置文件。 发布配置文件在我使用 Visual Studio 的本地机器上运行良好,但在 Jenkins 主机上使用 msbuild 失败。 它给出的错误是 ASPNETCOMPILER:错误 ASPRUNTIME:找不到路径“C:\Program Files (x86)\Jenkins\jobs\myProject\workspace\myProject\obj\Debug\AspnetCompileMerge\Source\bin\roslyn\csc.exe”的一部分。 [C:\Program Files (x86)\Jenkins\jobs\myProject\workspace\myProject\calendar.csproj] 我正在使用 Microsoft.Net.Compilers nuget 包来引入 C# 编译器,因为该项目的一些合作者仍在 Visual Studio 2013 上,但我们在项目中使用 C#6 语言功能。 事情是,在我添加发布标志之前,在 jenkins 上使用 MSBuild 构建的项目很好。 只是因为添加了/p:DeployOnBuild
  • 对于不是Visual Studio中的Web项目的项目,是否进行App.Config转换?(App.Config Transformation for projects which are not Web Projects in Visual Studio?)
    问题 对于基于Visual Studio 2010 Web的应用程序,我们具有“配置转换”功能,通过该功能,我们可以为不同的环境维护多个配置文件。 但是该功能不适用于Windows Services / WinForms或控制台应用程序的App.Config文件。 这里有建议的解决方法:将XDT magic应用于App.Config。 但是,它并不简单,需要许多步骤。 有没有更简单的方法来实现app.config文件的相同功能? 回答1 现在,此功能可以与本文中处理的Visual Studio加载项一起使用:SlowCheetah-Web.config转换语法现在可用于任何XML配置文件。 您可以右键单击web.config,然后单击“添加配置转换”。 执行此操作时,将获得一个web.debug.config和一个web.release.config。 您可以根据需要创建一个web.whatever.config,只要该名称与配置配置文件对齐即可。 这些文件只是您要进行的更改,而不是web.config的完整副本。 您可能会认为您想使用XSLT来转换web.config,但是尽管他们直观地感觉很对,但实际上是非常冗长的。 这是两种转换,一种使用XSLT,另一种使用XML Document Transform语法/命名空间。 与所有事物一样,XSLT中有多种方法可以执行此操作
  • 从命令行转换web.config文件(web.config file transform from command line)
    问题 我有两个目标构建环境。 发行和登台。 Web.config看起来像这样: <system.web> <authentication mode="Windows"> </authentication> <authorization> <deny users="?" /> </authorization> </system.web> 我想通过构建到暂存配置来对其进行转换:Web.Staging.config <system.web> <authentication mode="Windows"> </authentication> <authorization xdt:Transform="Replace"> <deny users="?" /> <allow roles="StagingRoles" /> <deny users="*" /> </authorization> </system.web> 我从这样的命令行构建: msbuild buildscript.build /p:Configuration=Staging 构建后,我看不到构建工件文件夹中的web.config文件已转换。 这里有什么问题吗? 谢谢 回答1 如果将以下xml添加到Web应用程序的.csproj文件的底部,则将确保在每次构建之前进行config转换: <Import Project="$
  • 在 CoreBuild 之前运行目标?(Running a target before the CoreBuild?)
    问题 我正在向我的项目中添加一个自定义.tt模板生成目标以在CoreBuild之前CoreBuild ,并且似乎有两种方法可以做到: <Project...> <Target Name="TransformOnBuild" AfterTargets="BeforeBuild"> </Project> 和 <Project...> <Target Name="TransformOnBuild" BeforeTargets="CoreBuild"> </Project> 如果我的目标应该在我的项目构建之前运行,因为项目依赖于它,我使用后者会更好吗? 我见过前者用来做诸如生成文本模板之类的事情,但这似乎是一种不可靠的方法,因为它可能会在CoreBuild之后CoreBuild ,这为时已晚。 或者有什么理由为什么AfterTargets="BeforeBuild"仍然保证在核心构建之前运行? 我还看到了BeforeTargets="BeforeBuild"它将构建得更早。 这是放置`.tt 文本生成目标的更好地方吗? 回答1 基于@stjin 的回答,似乎正在使用一个很好的解决方案 BeforeTargets="CoreCompile" DependsOnTargets="PrepareForBuild" 这就是 .net sdk(用于 .net 核心/标准项目的新型 csproj