我正在创建一个构建脚本来自动将我们的 Web 项目发布到测试机器。
我有一个成功执行此操作的 msbuild 脚本,但是当它运行时,它会为解决方案中的每个项目生成一个错误,指出“项目中不存在目标“_WPPCopyWebApplication””。
这是正确的,因为在我的每个项目文件中,我都没有导入包含此功能的相关 .targets 文件。
如果我确实更改了每个项目文件以导入 .targets 文件,那么我会收到每个项目的警告而不是错误,说明
MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets”无法再次导入。
它已经在“MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets (354,3)”中导入。这很可能是构建创作错误。此后续导入将被忽略。
目前,我在构建脚本的顶部导入了相关的 .targets 文件:
<Project ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project ="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets"/>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets"/>
Run Code Online (Sandbox Code Playgroud)
有没有办法防止出现“_WPPCopyWebApplication”不存在于项目文件中的错误,而不生成警告,指出在我将其添加到每个项目文件后存在重复导入?
如果目标文件是在我的构建脚本顶部导入的,为什么项目需要导入它?
编辑:
我目前正在使用 _WPPCopyWebApplication 这样的:
<Target Name="Publish" >
<RemoveDir Directories="$(OutputFolder)" ContinueOnError="true" />
<MSBuild Projects="myproject.csproj;anotherproject.csproj" Targets="ResolveReferences;_WPPCopyWebApplication" Properties="WebProjectOutputDir=$(OutputFolder);OutDir=$(WebProjectOutputDir)\" />
</Target>
Run Code Online (Sandbox Code Playgroud)
我是 MSBuild 的初学者。到目前为止,我已经能够创建一个名为“MakeTextFile”的自定义任务,它根据您传递的内容属性在 C:\ 中创建一个文本文件。这可以从命令行提示符运行。
我也将它包含在我的 .targets 文件中(在项目标签下):
<ItemGroup>
<AvailableItemName Include="CreateTextFileAction" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
当我在客户端应用程序 .csproj 上使用 Import 标记时,我现在可以将项目构建操作设置为“CreateTextFileAction”,但是该操作永远不会触发(因为 C:\ 上没有创建任何文本文件)
如何获取用我的构建操作“CreateTextFileAction”标记的项目的所有文件路径并将它们传递给我的自定义任务?
作为参考,我的 .targets 文件:
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<AvailableItemName Include="CreateTextFileAction" />
</ItemGroup>
<UsingTask AssemblyFile="CustomMSBuildTask.dll" TaskName="CustomMSBuildTask.MakeTextFile" />
<Target Name="MyTarget">
<MakeTextFile Contents="TODO HOW DO I GRAB MARKED FILES?" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud) 我想使用 MSBuild 社区任务中的 VersionTask 来设置修订计算类型。但是,我很难理解如何在 csproj 文件中实际连接任务。
该项目有一个 AssemblyInfo.cs,它定义了以下属性:
[assembly: AssemblyVersion("3.2.5.*")]
Run Code Online (Sandbox Code Playgroud)
我想要做的是用我自己的自定义处理来覆盖修订号处理的生成。
我已将自定义版本任务放入csproj文件中,如下所示:
<UsingTask TaskName="MyCo.Build.Tasks.Version" AssemblyFile="$(SolutionDir)\..\Build\.build\MyCo.Build.Tasks.dll" />
Run Code Online (Sandbox Code Playgroud)
实际的任务调用如下:
<Target Name="BeforeBuild">
<Message Text="Setting Revision Number to $(BuildNumber)" />
<MyCo.Build.Tasks.Version RevisionType="BuildServerNumber" Revision="$(BuildNumber)" /></Target>
Run Code Online (Sandbox Code Playgroud)
我可以看到由于消息任务而调用了目标 BeforeBuild,但 exe 文件仍然具有标准生成的编号,如下所示: 文件版本:3.2.5.27547
我期待类似 3.2.5.111 的内容(内部版本号作为参数传递到 MSBuild)。
由于版本任务会覆盖修订版“*”值的默认处理,因此我认为没有必要实际修改 AssemblyInfo.cs 文件。
我是否需要将 Version 任务的输出值传递到 MSBuild 参数中?我实际上是否需要使用 AssemblyVersion 任务来更新文件中的值?
显然,我试图避免更改 AssemblyInfo.cs,我只想覆盖版本号处理。
有人可以建议吗?
编辑:我刚刚在安装程序的 chm 文件中找到了以下使用示例,部分回答了我的问题。
<Version BuildType="Automatic" RevisionType="Automatic" Major="1" Minor="3" >
<Output TaskParameter="Major" PropertyName="Major" />
<Output TaskParameter="Minor" PropertyName="Minor" />
<Output TaskParameter="Build" PropertyName="Build" />
<Output TaskParameter="Revision" PropertyName="Revision" />
</Version>
<Message …Run Code Online (Sandbox Code Playgroud) 我有一个包含 10 多个项目的大型解决方案,使用 C++。
整个解决方案仅适用于x64,但项目P需要x64和win32版本(在运行时加载正确的版本)除外。
项目P依赖于其他几个项目的 lib 文件:C和H,它们被编译成 libs。
P引用了C和H,如下所示:
<ProjectReference Include="..\C\C.vcxproj">
<Project>{....}</Project>
</ProjectReference>
<ProjectReference Include="..\H\H.vcxproj">
<Project>{....}</Project>
</ProjectReference>
Run Code Online (Sandbox Code Playgroud)
我想为两个平台构建项目P。
我选择从一个meta-P项目中做到这一点,它像这样调用P:
<MSBuild Projects="..\P\P.vcxproj" Properties="Platform=Win32"/>
<MSBuild Projects="..\P\P.vcxproj" Properties="Platform=x64"/>
Run Code Online (Sandbox Code Playgroud)
这允许开发人员自由更改P,然后通过构建meta-P一次构建两个版本。
问题在于,当元 P在项目P上调用 MSBuild 时,对C和H的引用受解决方案环境(其中活动平台始终为 x64)的影响。
当涉及到将 Win32 P链接到其正确的C.lib和H.lib 时,开放解决方案配置启动,工作室尝试将其与 x64 版本链接,但失败了。
我暂时解决了它,使用 …
根据微软的Exec Task,它通过使用指定的参数来运行指定的程序或命令:
命令- 必需的字符串参数。
要运行的命令。这些可以是系统命令(例如 attrib),也可以是可执行文件(例如 program.exe、runprogram.bat 或 setup.msi)。
该参数可以包含多行命令。或者,您可以将多个命令放入批处理文件中并使用此参数运行它。
我们目前正在使用CustomBuild类似以下的内容:
<CustomBuild Condition="'$(Platform)'=='Win32'" Include="rdrand.asm">
<Message>Building and assembling rdrand.asm</Message>
<Command>ml.exe /c /nologo /D_M_X86 /W3 /Cx /Zi /safeseh /Fo"$(IntDir)rdrand-x86.obj" "%(FullPath)"</Command>
<Outputs>$(IntDir)\rdrand-x86.obj;%(Outputs)</Outputs>
</CustomBuild>
Run Code Online (Sandbox Code Playgroud)
我们希望切换到 NASM 和 Exec Task,因为它为 Windows 和 Linux 提供了一组源。它还允许我们在适当的时候为 Windows 手机和平板电脑提供 ASM,例如如果 NASM 不可用,那么我们将使用备用 C/C++ 实现。PMULL和PMULL2。
注意:我们不希望用户做任何事情。我们不希望他们选择某些内容,也不希望他们设置定义。要求用户做某事意味着我们必须回答用户的问题。我们希望事情对用户来说“正常工作”;F5对于用户而言,在 Visual Studio 下应该“正常工作”。
我的第一个问题是,Exec Task 是适合这项工作的工具吗?我的第二个问题是,我们如何确定nasm.exeMSBuild 中是否可用?在这里,“可用”意味着它的路径,所以我们可以调用它。
我已经MSBuild.ILMerge.Task使用安装到我的项目中Nuget。当我尝试构建我的项目时,出现错误:
错误:不允许未解析的程序集引用:ICSharpCode.SharpZipLib。
我到处搜索但找不到任何有用的东西......
如何修复此错误?
在尝试在 Visual Studio for Mac Community (7.0.1 [build 24]) 上编译 Xamarin Forms (2.3.4.247) 项目时,我在编码一段时间后不断收到以下两个错误,任何有关导致该错误的原因以及如何修复的线索它?
/Users/PathToProjectRoot/packages/Xamarin.Forms.2.3.4.247/build/portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20/Xamarin.Forms.targets(3,3): Error MSB4061: The "XamlCTask" task could not be instantiated from "/Users/PathToProjectRoot/packages/Xamarin.Forms.2.3.4.247/build/portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20/Xamarin.Forms.Build.Tasks.dll". Could not load file or assembly 'Xamarin.Forms.Build.Tasks' or one of its dependencies (MSB4061) (ProjectName)
/Users/PathToProjectRoot/packages/Xamarin.Forms.2.3.4.247/build/portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20/Xamarin.Forms.targets(3,3): Error MSB4060: The "XamlCTask" task has been declared or used incorrectly, or failed during construction. Check the spelling of the task name and the assembly name. (MSB4060) (ProjectName)
Run Code Online (Sandbox Code Playgroud)
bin和obj文件夹以尝试重建。 …我试图使用 MSBuild 实现以下目标:我的主项目 ( MyProject.csproj) 应包含几个Reference项目,但其中一个项目的路径是由目标设置的属性Reference值。SomeProperty具体来说, 的值SomeProperty是使用ReadLinesFromFileTask.
以下是 的高级结构MyProject.csproj:
<Project>
<Target Name="CreateSomeProperty">
<!-- Tasks that ultimately set $(SomeProperty) by parsing a value with ReadLinesFromFileTask -->
</Target>
<ItemGroup>
<Reference Include="$(SomeProperty)" />
<!-- Other Reference items -->
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个设置不起作用。Dependencies我在 VS 解决方案资源管理器中的节点下看到那些黄色小三角形MyProject,因为该项目正在寻找缺少字符的路径中的 DLL。The type or namespace name could not be found同样,当我构建项目时,即使我仍然看到Message目标内任务的输出,我也会收到一堆错误。据推测,在评估阶段加载项目失败CreatePathProperty后,目标正在执行阶段运行。Reference
有没有办法让这样的设置有效?我尝试过在元素BeforeTargets="Build"中设置Target,然后InitialTargets="CreateSomeProperty"在 …
在 VS2019 中,我有 MVC dotnet 框架项目,并且在进行 dotnet build 时遇到了问题
error MSB4801: The task factory "CodeTaskFactory" is not supported on the .NET Core version of MSBuild
Run Code Online (Sandbox Code Playgroud)
错误 MSB4175:无法从程序集“C:\Program Files\dotnet\sdk\3.1.201\Microsoft.Build.Tasks.Core.dll”加载任务工厂“CodeTaskFactory”。
我们之前有过讨论。
搜索 .props 文件数小时后,.prop 和 .targets 中的所有 $(VCTargetsPath) 都被删除,但 Visual Studio 仍然可以正确识别该宏/变量。
通过修改 Microsoft.Cpp.ToolsetLocation.props,可以修改 $(VCTargetsPath),从而导致 VS 无法再创建新项目。
那么,这个宏到底定义在哪里呢?
我相信这个宏不是也不应该被硬编码。
msbuild-task ×10
msbuild ×7
.net ×2
c# ×2
c++ ×2
csproj ×2
ilmerge ×1
msbuild-4.0 ×1
task ×1
xamarin ×1