【问题标题】:How to publish additional files using msbuild file and TeamCity?如何使用 msbuild 文件和 TeamCity 发布其他文件?
【发布时间】:2014-01-29 22:30:31
【问题描述】:

我正在使用 msbuild 文件、TeamCity 和 Web Deploy 来部署我的站点,对于 Visual Studio csproj 文件中包含的文件,一切正常。除了这些文件之外,我还想根据环境发布更多文件,例如许可证文件等。

这是我的构建文件 DeployToTest.proj:

<Project DefaultTargets="Deploy" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<ItemGroup>
<LicenseSourceFiles Include="License.config"/>
<RobotSourceFile Include="robots.txt" />
</ItemGroup>

<Target Name="Build">
<Message Text="Starting build" />
<MSBuild Projects="..\..\WebApp.sln" Properties="Configuration=Test" ContinueOnError="false" />
<Message Text="##teamcity[buildNumber '$(FullVersion)']"/>
<Message Text="Build successful" />
</Target>

<Target Name="Deploy" DependsOnTargets="Build">
<Copy SourceFiles="@(LicenseSourceFiles)" DestinationFolder="..\..\wwroot"></Copy>
<Copy SourceFiles="@(RobotSourceFile)" DestinationFolder="..\..\wwwroot"></Copy>

<Message Text="Started deploying to test" />
<Exec Command="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe ..\..\wwwroot\WebApp.csproj /property:Configuration=Test /t:MsDeployPublish /p:MsDeployServiceUrl=99.99.99.99;DeployIisAppPath=MySite;username=user;password=pass;allowuntrustedcertificate=true" />
<Message Text="Finished deploying to test" />
</Target>
</Project>

如您所见,我尝试复制 license.config 和 robots.txt 没有任何运气。

此 .proj 文件被选为 TeamCity 中的“构建文件路径”。

对我如何做到这一点有什么建议吗?

【问题讨论】:

    标签: msbuild teamcity webdeploy


    【解决方案1】:

    要解决此问题,可能值得执行构建脚本并将详细程度设置为“详细”或“诊断”级别。这应该会告诉您复制步骤失败的确切原因。

    然而,最可能的问题之一可能是脚本使用了相对文件路径,这取决于工作目录设置为正确的值。对于构建脚本,我更喜欢使用绝对路径来防止任何文件路径问题。

    要获取绝对路径,您可以使用MSBuildProjectDirectory 属性。此属性的值指向包含当前正在执行的 MsBuild 脚本的目录的路径。有了它,您可以像这样更改您的 MsBuild 脚本:

    <Project DefaultTargets="Deploy" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
        <PropertyGroup>
            <BaseDir>$(MSBuildProjectDirectory)</BaseDir>
        </PropertyGroup>
    
        <ItemGroup>
            <LicenseSourceFiles Include="$(BaseDir)\License.config"/>
            <RobotSourceFile Include="$(BaseDir)\robots.txt" />
        </ItemGroup>
    
        <Target Name="Build">
            <Message Text="Starting build" />
            <MSBuild Projects="$(BaseDir)\..\..\WebApp.sln" Properties="Configuration=Test" ContinueOnError="false" />
            <Message Text="##teamcity[buildNumber '$(FullVersion)']"/>
            <Message Text="Build successful" />
        </Target>
    
        <Target Name="Deploy" DependsOnTargets="Build">
            <Copy SourceFiles="@(LicenseSourceFiles)" DestinationFolder="$(BaseDir)\..\..\wwroot"></Copy>
            <Copy SourceFiles="@(RobotSourceFile)" DestinationFolder="$(BaseDir)\..\..\wwwroot"></Copy>
    
            <Message Text="Started deploying to test" />
            <Exec Command="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe ..\..\wwwroot\WebApp.csproj /property:Configuration=Test /t:MsDeployPublish /p:MsDeployServiceUrl=99.99.99.99;DeployIisAppPath=MySite;username=user;password=pass;allowuntrustedcertificate=true" />
            <Message Text="Finished deploying to test" />
        </Target>
    </Project>
    

    现在,如果相对文件路径确实存在问题,这应该可以解决问题。

    【讨论】:

    • 文件被复制到正确的目录,但没有包含在Web Deploy部署的包中...
    • @Kulvis 好的。我在 Web 部署方面的经验有限,但在这种情况下,问题可能出在部署设置上。它是部署所有文件还是仅部署运行应用程序所需的文件?您能否向我们提供部署设置?
    • 除了我在问题中粘贴的设置之外,没有其他部署设置。仅部署 csproj 文件中包含的文件。所以我需要一种在 TeamCity 中包含其他文件的方法...
    • 如果 MsDeploy 只复制 csproj 文件中的文件,那么它只会复制 csproj 文件中的其他文件。因此,您可以在 csproj 中添加指向这些文件的链接。或者,您可以通过 msbuild 脚本中的其他目标部署文件。但是根据您的描述,我认为 MsDeploy 不会自动获取它们。
    【解决方案2】:

    解决方案是在 Visual Studio 中更改 Web 项目的设置。在打包/发布 Web 下,我将“要部署的项目”设置为“此项目文件夹中的所有文件”。然后我添加了一个过滤器来删除所有 .cs 文件和其他不需要的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多