标签: msbuild-target

MSBuild将参数传递给CallTarget

我正在尝试在我的MSBuild文件中创建一个可重用的目标,所以我可以使用不同的参数多次调用它.

我有这样的骨架:

<Target Name="Deploy">
    <!-- Deploy to a different location depending on parameters -->
</Target>

<Target Name="DoDeployments">
    <CallTarget Targets="Deploy">
        <!-- Somehow indicate I want to deploy to dev -->
    </CallTarget>

    <CallTarget Targets="Deploy">
        <!-- Somehow indicate I want to deploy to testing -->
    </CallTarget>
</Target>
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何允许参数传递到CallTarget,然后依次传递给Target自己.

msbuild parameter-passing msbuild-target

63
推荐指数
2
解决办法
4万
查看次数

将x86和x64库添加到NuGet包中

我创建了一个依赖于CEFsharp的库,它需要为特定平台构建库.所以没有AnyCPU支持.

现在我想将它打包成NuGet.据我所知,你必须将这些文件放入build文件夹,并有一个.targets文件,选择正确的dll引用.所以我最终得到了一个看起来像这样的NuGet包:

lib
    monodroid
        MyLib.dll
    xamarin.ios10
        MyLib.dll
    net45
        MyLib.dll (x86)
build
    net45
        x86
            MyLib.dll (x86)
        x64
            MyLib.dll (x64)
        MyLib.targets
Run Code Online (Sandbox Code Playgroud)

我把以下内容放在.targets文件中:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="PlatformCheck" BeforeTargets="InjectReference"
    Condition="(('$(Platform)' != 'x86') AND  ('$(Platform)' != 'x64'))">
    <Error  Text="$(MSBuildThisFileName) does not work correctly on '$(Platform)' platform. You need to specify platform (x86 or x64)." />
  </Target>

  <Target Name="InjectReference" BeforeTargets="ResolveAssemblyReferences">
    <ItemGroup Condition="'$(Platform)' == 'x86' or '$(Platform)' == 'x64'">
      <Reference Include="MyLib">
        <HintPath>$(MSBuildThisFileDirectory)$(Platform)\MyLib.dll</HintPath>
      </Reference>
    </ItemGroup>
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.现在来问题了.将此NuGet添加到新的WPF项目时,我看到.csproj文件中出现的库的引用如下: …

nuget msbuild-target

17
推荐指数
2
解决办法
9050
查看次数

MSBuild还原目标 - MSB4057:项目中不存在目标"还原"

我们的主要产品组合中有超过20个解决方案(超过880个项目),我们有一组复杂的构建脚本,但是我们正在尝试从msbuild管道中自动恢复nuget包.目前,这是通过手动调用nuget来恢复软件包来完成的.

根据https://docs.microsoft.com/en-us/nuget/schema/msbuild-targets我应该能够运行此命令并运行恢复:

# works
& $script:msBuildPath $solutionName /t:build /v:q /clp:ErrorsOnly /nologo /p:...
# doesn't works
& $script:msBuildPath $solutionName /t:restore,build /v:q /clp:ErrorsOnly /nologo /p:...
Run Code Online (Sandbox Code Playgroud)

但是,当我添加restore,到上面它会抛出一个错误

MSB4057: The target "restore" does not exist in the project
Run Code Online (Sandbox Code Playgroud)

我从哪里开始研究,以了解为什么它找不到这个目标?我们主要使用VS 2015和.NET 4.6.2,因此VS2017的任何特定内容目前都不适合我.


如果我省略了/v:q/clp:ErrorsOnly标志,我会得到这个(稍微消毒的解决方案/项目名称和路径)

PS Z:\git\company> build c
building Common\Common.sln
Build started 11/15/2017 11:08:54 AM.
     1>Project "Z:\git\company\Common\Common.sln" on node 1 (restore;build target(s)).
     1>ValidateSolutionConfiguration:
         Building solution configuration "DEBUG|Any CPU".
     1>Z:\git\company\Common\Common.sln.metaproj : error MSB4057: The target "restore" does …
Run Code Online (Sandbox Code Playgroud)

c# msbuild msbuild-target nuget-package-restore .net-4.6.2

10
推荐指数
1
解决办法
6924
查看次数

将自定义msbuild目标从Solution传递给Project

我有一个包含大量相关.csproj文件的解决方案.

每个.csproj文件都有一个<Target Name="PublishQA">....

当我尝试编译整个解决方案时,构建失败:

> msbuild mysolution.sln /t:PublishQA`
"c:\myproj.sln" (publishqa target) (1) ->
  c:\myproj.sln.metaproj : error MSB4057: The target "PublishQA" does not exist in the project. [c:\myproj.sln]
Run Code Online (Sandbox Code Playgroud)

当我.csproj直接构建项目时,它构建得很好.

如何告诉msbuild将目标传递给项目文件???

msbuild msbuild-task msbuild-target

7
推荐指数
1
解决办法
1543
查看次数

MSBuild目标和Visual Studio 2012问题

我很难通过Webdeploy使用Visual Studio 2012 UI部署我的第三方非参考程序集.我有一个名为'libraries'的文件夹,其中包含一些程序集.通过我的*.csproj文件中的以下内容,我可以将Build Action设置为' ThirdPartyAssemblies ':

<ItemGroup>
  <AvailableItemName Include="ThirdPartyAssemblies">
    <Visible>false</Visible>
  </AvailableItemName>
</ItemGroup>
<Target Name="AfterBuild">
  <Message Text="Build | Third party assemblies" Importance="high" />
  <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(ThirdPartyAssemblies)" SkipUnchangedFiles="true" />
</Target>
Run Code Online (Sandbox Code Playgroud)

这很好用; 当我构建时,程序集被复制到bin文件夹的根目录:-)现在我遇到了一个问题:我无法通过Webdeploy将这些文件发布到服务器上.我尝试了很多东西,看起来我找不到适合这个任务的MSBuild目标...使用Visual Studio 2010我可以使用:

<Target Name="MyTargetName">
  <Message Text="Deploy | Third party assemblies" Importance="high" />
  <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(ThirdPartyAssemblies)" SkipUnchangedFiles="true" />
</Target>
<PropertyGroup>
  <OnAfterCopyAllFilesToSingleFolderForPackage>
    MyTargetName
  </OnAfterCopyAllFilesToSingleFolderForPackage>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

问题是; 该OnAfterCopyAllFilesToSingleFolderForPackage目标不再被称为: - /

在深入研究之后C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.targets' file, I've also tried 'OnAfterCopyAllFilesToSingleFolderForMsdeploy,我却无法让它发挥作用.

任何人都可以告诉我我可以使用哪些目标将这些程序集复制到Package文件夹/带有Webdeploy的服务器?

为什么Visual Studio 2012没有将完整的bin文件夹复制到Package文件夹?

msbuild msbuild-task webdeploy msbuild-target visual-studio-2012

7
推荐指数
1
解决办法
8242
查看次数

针对自定义道具/目标的MSBuild设计实践

我有一个NuGet包,正在使用自定义的props / targets文件,并且想知道有关如何在定义和覆盖方面对许多Properties,Items和Targets进行最佳实践的信息。

最好直接在我的MyNuGetPackage.targets文件中拥有所有属性,而根本不使用MyNuGetPackage.props,就像这样吗?

<PropertyGroup>
    <UseMyTarget Condition="'$(Prop1)' == ''">true</UseMyTarget>
</PropertyGroup>

<Target Name="MyTarget" Condition="'$(UseMyTarget)' == 'true'>
  ...
</Target>
Run Code Online (Sandbox Code Playgroud)

还是更好的做法是无条件地UseMyTarget.props文件中定义并将目标保留在.targets文件中?

如果我需要捕获Microsoft或其他人为其设置默认值的属性,则两种方法都将失效。例如:

<PropertyGroup>
    <MyCustomOutputPath>$(OutputPath)/somethingelse</UseMyTarget>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

如果我在中定义它.propsOutputPath可能尚未设置...

另一方面,许多作者似乎只是在使用.targets自己的东西……所以我最好还是对自己的依赖项做这样的事情,.targets而不用烦恼.props文件吗?

<Project InitialTargets="InitializeDependentProperties">
  <Target Name="InitializeDependentProperties">
    <PropertyGroup>
      <MyCustomOutputPath>$(OutputPath)/somethingelse</UseMyTarget>
    </PropertyGroup>
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

微软自己的MSBuild道具/目标实践似乎根本没有遵循任何标准/惯例。

我确实希望允许消耗性项目能够.props/.targets通过设置Properties/Items/Targets自己来改变我的行为。

msbuild msbuild-target msbuild-15

6
推荐指数
0
解决办法
288
查看次数

SQL数据库项目:根据构建配置构建不同的脚本

我想解决的问题是根据构建配置构建不同的脚本.

假设我们有两个SQL Server实例:

  • 已连接链接服务器的企业版
  • 用于离线开发和单元测试的LocalDb版本

当LocalDB使用本地表替换这些视图时,企业版具有链接服务器的视图.

这些链接服务器视图和本地表具有相同的名称和字段集.因此默认情况下它们不包含在构建中(Build Action = None).相反,它们包含在项目文件的BeforeBuild Target中.

<Target Name="BeforeBuild">

    <ItemGroup Condition=" '$(Configuration)' == 'LocalDb'">
        <Build Include="Local_Tables\*.sql" />
    </ItemGroup> 

    <ItemGroup Condition=" '$(Configuration)' != 'LocalDb' ">
        <Build Include="Linked_Server_Views\*.sql" />
    </ItemGroup>

</Target>
Run Code Online (Sandbox Code Playgroud)

但问题是Visual Studio缓存数据库模型,如果我们首先为LocalDb构建项目,然后尝试构建企业配置项目 - Visual Studio输出错误:

错误:SQL71508:模型已经有一个具有相同名称的元素

如果要关闭并打开解决方案或卸载项目和重新加载项目,Visual Studio将重新创建dbmdl文件,并且正在构建企业配置而不会出现错误.

所以我的假设是,如果我刷新dbmdl缓存,我将得到平滑的构​​建,没有错误.


当您打开或在Visual Studio 2012重装SQL Server数据库的项目,它将创建一个具有扩展名的文件dbmdl,这是作为描述的反序列化和缓存数据库模型在这里.

在dbmdl文件重新创建的那一刻,Visual Studio输出以下内容:

Deserializing the project state for project 'MyProject.sqlproj'...
Detecting file changes for project 'MyProject.sqlproj'...
Deserialization has been completed for project 'MyProject.sqlproj'.
Run Code Online (Sandbox Code Playgroud)

如何在没有项目重新加载且不更改项目xml文件的情况下强制Visual Studio刷新dbmdl缓存?

有没有办法刷新dbmdl缓存,将命令放入项目xml文件的BeforeBuild或AfterBuild目标?

或者问题的整个方法是错误的,还有另一种方法可以根据构建配置构建不同的脚本?

msbuild database-project msbuild-target visual-studio-2012 sql-server-data-tools

5
推荐指数
1
解决办法
4510
查看次数

MSBuild 目标未在 NET Core 项目中运行

我正在使用 Visual Studio 2019、.NET Core 3.1

我创建一个新项目并使用模板类库(.NET Core)

我右键单击解决方案资源管理器中的项目,然后单击“编辑项目文件”

并添加以下目标:

  <Target Name="Test" AfterTargets="Build">
    <Message Text="This is a test" Importance="high" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

当我发布时...它多次达到此目标,并且在输出窗格中我多次看到“这是一个测试”。

我希望这个目标在发布而不是构建之后执行。

这适用于 .NET Core Web API 解决方案,在发布事件之前,我正在对发布结果中包含的角度项目执行ng 构建。

但在类库中,即使我正在执行实际的发布,发布 msbuild 目标也永远不会被执行。

所以...

  <Target Name="Test" AfterTargets="Publish">
    <Message Text="This is a test" Importance="high" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

此消息永远不会显示在我的输出窗格中。

该类库将发布到私有 NuGet 服务器,我想在发布操作完成后执行nuget 推送。一旦我让 msbuild 目标在正确的时间实际运行,我就可以轻松执行命令以推送到 NuGet 服务器。

我在这里错过了什么吗?在 .NET Core 库解决方案上完成发布操作后,如何执行目标?

编辑: 这提出了另一个问题。当我发布时,我得到这个输出:

1>------ Build started: Project: ClassLibrary1, Configuration: Release Any CPU ------
1>ClassLibrary1 -> C:\Users\11016409\Documents\source\Libraries\NET Core\ClassLibrary1\ClassLibrary1\bin\Release\netcoreapp3.1\ClassLibrary1.dll
1>This is …
Run Code Online (Sandbox Code Playgroud)

msbuild visual-studio msbuild-target

5
推荐指数
1
解决办法
2030
查看次数

在TeamCity构建的MSBuild项目中访问参数%build.counter%

我有一个MSBuild/C#项目,目标是试图访问应该由TeamCity设置的`%build.counter%参数.

<Target Name="TraceBuildParameters" BeforeTargets="BeforeBuild">
    <Message Text="Build.Counter=$(build_counter)" />
</Target>
Run Code Online (Sandbox Code Playgroud)

我可以在TeamCity项目构建设置中访问它,但在脚本中没有一个工作:

build.counter // msbuild error
build_counter // null
system_build_counter // null
teamcity_system_build_counter // null
teamcity_build_counter // null
Run Code Online (Sandbox Code Playgroud)

是否可以访问此参数,是否暴露?

msbuild teamcity msbuild-target

2
推荐指数
1
解决办法
1581
查看次数

错误MSB4057:项目中不存在目标"v8"

我正在尝试使用官方构建脚本并遵循官方Windows构建说明,将V8构建为ArangoDB的一部分.

所有v8*targets(v8-build.bat)的编译都失败:

msbuild All.sln /t:v8 /p:Configuration=Release /p:Platform=x64
msbuild All.sln /t:v8_libbase /p:Configuration=Release /p:Platform=x64
msbuild All.sln /t:v8_libplatform /p:Configuration=Release /p:Platform=x64
Run Code Online (Sandbox Code Playgroud)

错误MSB4057:项目中不存在目标"v8".

如果我在Visual Studio中打开解决方案文件,它看起来像这样:

All.sln

我可以建立v8,v8_libbasev8_libplatform在VS中很好.

  • Windows 7 64位
  • Visual Studio 2013 Ultimate
  • Cygwin 2.2.0
  • cmake 3.3.1

v8 compiler-errors msbuild-target arangodb visual-studio-2013

1
推荐指数
1
解决办法
6591
查看次数

MsBuild PostBuild目标

我已将AfterBuild目标添加到Visual Studio项目,这是包含多个Visual Studio项目的解决方案的一部分。

解决方案设置示例

例子.sln

  • ExampleProj.csproj

  • ExampleProj.Test.csproj

目标示例:

  <Target Name="PostBuildScript" AfterTargets="AfterBuild" Condition="'$(Configuration)' == 'Release'">
    <PropertyGroup>
      <BuildCommand>"SomeApplication.exe")</BuildCommand>
    </PropertyGroup>
    <Exec Command="$(BuildCommand)" ConsoleToMSBuild="true" LogStandardErrorAsError="true" WorkingDirectory="$(ProjectDir)" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

我希望此目标在解决方案中的所有Visual Studio项目都已建立之后才能执行。

有没有办法实现这一目标。

注意:dotnet build在Visual Studio中使用和生成命令时,我的行为必须相同。

c# msbuild csproj msbuild-target visual-studio-2017

0
推荐指数
1
解决办法
1392
查看次数