在TeamCity构件中排除文件类型

5

我正在自己第一次设置TeamCity。我必须说,它非常好用和简单易懂,但我遇到了一个问题,我无法解决并且找不到任何相关信息。

当我想要发布我的构建产物时,我希望排除掉某些文件类型。

例如:

%system.agent.work.dir%\trunk\Source\Projects\Webproject.Web/Controllers => Webproject.Web/Controllers

然而,我不想复制文件夹中的所有 .cs 文件,只需要文件夹本身。 有没有可能仅复制文件夹而非其内容,之后再复制需要的内容呢?或者在复制目录时可以排除某些文件吗?


请参阅https://dev59.com/UWcs5IYBdhLWcg3wh0b7,以获取有关问题常见解决方案的信息。 - Vadzim
1个回答

3

您可以添加一个MSBUILD目标,为您准备"部署"包。我有以下内容(可能需要根据您的项目进行一些更改):

  <Target Name="Publish" DependsOnTargets="Build" Condition="'$(WebProjectOutputDir)'!=''">
    <RemoveDir Directories="$(WebProjectOutputDir)" ContinueOnError="true" />
    <!-- Log tasks -->
    <Message Text="Publishing web application for $(MSBuildProjectName)" />
    <Message Text="WebProjectOutputDir: $(WebProjectOutputDir)" />
    <!-- Create the _PublishedWebsites\app\bin folder -->
    <MakeDir Directories="$(WebProjectOutputDir)\bin" />
    <!-- Copy build outputs to _PublishedWebsites\app\bin folder -->
    <Copy SourceFiles="@(IntermediateAssembly)" DestinationFolder="$(WebProjectOutputDir)\bin" SkipUnchangedFiles="true" />
    <Copy SourceFiles="@(AddModules)" DestinationFolder="$(WebProjectOutputDir)\bin" SkipUnchangedFiles="true" />
    <Copy SourceFiles="$(IntermediateOutputPath)$(_SGenDllName)" DestinationFolder="$(WebProjectOutputDir)\%(Content.SubFolder)%(Content.RecursiveDir)" SkipUnchangedFiles="true" Condition="'$(_SGenDllCreated)'=='true'" />
    <Copy SourceFiles="$(IntermediateOutputPath)$(TargetName).pdb" DestinationFolder="$(WebProjectOutputDir)\bin" SkipUnchangedFiles="true" Condition="'$(_DebugSymbolsProduced)'=='true'" />
    <Copy SourceFiles="@(DocFileItem)" DestinationFolder="$(WebProjectOutputDir)\bin" SkipUnchangedFiles="true" Condition="'$(_DocumentationFileProduced)'=='true'" />
    <Copy SourceFiles="@(IntermediateSatelliteAssembliesWithTargetPath)" DestinationFiles="@(IntermediateSatelliteAssembliesWithTargetPath->'$(WebProjectOutputDir)\bin\%(Culture)\$(TargetName).resources.dll')" SkipUnchangedFiles="true" />
    <Copy SourceFiles="@(ReferenceComWrappersToCopyLocal); @(ResolvedIsolatedComModules); @(_DeploymentLooseManifestFile); @(NativeReferenceFile)" DestinationFolder="$(WebProjectOutputDir)\bin" SkipUnchangedFiles="true" />
    <!-- copy any referenced assemblies to _PublishedWebsites\app\bin folder -->
    <Copy SourceFiles="@(ReferenceCopyLocalPaths)" DestinationFiles="@(ReferenceCopyLocalPaths->'$(WebProjectOutputDir)\bin\%(DestinationSubDirectory)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
    <!-- Copy content files recursively to _PublishedWebsites\app\ folder -->
    <Copy SourceFiles="@(Content)" DestinationFolder="$(WebProjectOutputDir)\%(Content.RelativeDir)" />
    <!-- Copy items that have been marked to be copied to the bin folder -->
    <Copy SourceFiles="@(_SourceItemsToCopyToOutputDirectory)" DestinationFolder="$(WebProjectOutputDir)\bin" SkipUnchangedFiles="true" />
    <Copy SourceFiles="@(_SourceItemsToCopyToOutputDirectoryAlways)" DestinationFolder="$(WebProjectOutputDir)\bin" SkipUnchangedFiles="false" />
  </Target>

因此,在TC构建中,我使用以下方式的MSBUILD builder:
Targets: Rebuild;Publish

Command line parameters: /p:WebProjectOutputDir="%system.teamcity.build.workingDir%\Website"

您可以将Website目录用作您的构件。

好的,当涉及到我应该在哪里添加这个MSBuild目标时,我有点迷失了。不过我能看出你在做什么,很有道理。 - MrW
我希望能够从TC界面控制所有内容,而不必处理MSbuild目标。但是仅复制文件夹似乎有点奇怪。 - MrW
1
可以说创建部署包是构建过程的一部分。构件只是从生成的构建输出中“收集”的。因此,我认为在构建文件中拥有所有内容是正确的方法;它允许您测试和修改部署包,并且它是您的源代码的一部分,因此在未来设置相同的构建很容易。只需在文本编辑器中打开CSPROJ文件(它是一个MSBUILD脚本),并将目标添加到文件底部,就在关闭根标记之前。那应该就是你所需要的。 - Lucero
好的,我明白你的意思了!那么我需要为解决方案中的所有项目单独执行此操作吗?另外,完全不同的问题应该作为自己的帖子发布,但是程序集的版本控制呢?在TC中是否可能实现,你知道吗? - MrW
我为每个MVC站点使用一个构建配置。但是,每个MVC站点都需要插入此目标(该目标实际上是VS在使用“解决方案资源管理器”中的Web项目上的右键单击执行“发布”时内部使用的已修复版本)。关于版本控制,我只是使用自动程序集版本方案(类似于这样:[assembly: AssemblyVersion("1.0.*")]),并使用强名称密钥对程序集进行签名。我使用TC构建触发器和工件依赖项来确保所有依赖项目都使用当前版本重新构建。 - Lucero
如果你对发布目标的修复感兴趣,可以在这里找到相关文档:http://forums.asp.net/t/1043621.aspx(请注意,原始目标名称是“_CopyWebApplication”,而不是“Publish”)。 - Lucero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接