9

我有两个许可证文件,我想在\bin构建发布时都将它们包含在我的目录中。

这两个文件都在App_Data目录中(它们的初始位置无关紧要,它们只需要在 中结束\bin)并具有以下属性集:

  • Build Action=Content
  • Copy to Output Directory=Copy Always

它们不在\bin我构建或发布的时候。

我的设置有什么问题:设置、文件夹、文件,还有什么……?

更新

我将文件移出 App_Data 目录并将它们放在项目根目录中,现在它们被复制到\bin构建中。

4

4 回答 4

10

我通过稍微扩展我的 .csproject 文件在几个项目中完成了此操作。以下代码应直接放在ProjectWebProject.csproj 中的节点下方。当AfterBuild从 Visual Studio 正常构建时,目标只是将一组文件(在本例中为“未引用的 DLL”)复制到 bin 文件夹。CustomCollectFiles 在部署时基本上做同样的事情。

  <PropertyGroup>
    <UnreferencedDlls>..\lib\Unreferenced\**\*.dll</UnreferencedDlls>
  </PropertyGroup>
  <PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>
  </PropertyGroup>
  <Target Name="AfterBuild">
    <Message Text="Copying unreferenced DLLs to bin" Importance="High" />
    <CreateItem Include="$(UnreferencedDlls)">
      <Output TaskParameter="Include" ItemName="_UnReferencedDLLs" />
    </CreateItem>
    <Copy SourceFiles="@(_UnReferencedDLLs)" DestinationFolder="bin\%(RecursiveDir)" SkipUnchangedFiles="true" />
  </Target>
  <Target Name="CustomCollectFiles">
    <Message Text="Publishing unreferenced DLLs" Importance="High" />
    <ItemGroup>
      <_CustomFiles Include="$(UnreferencedDlls)" />
      <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
        <DestinationRelativePath>bin\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
  </Target>

您需要修改的部分基本上是UnreferencedDlls与您的文件夹结构匹配的节点。该**\*.dll部分仅表示“此处以下任何级别的每个 DLL 文件”。

于 2013-08-07T19:17:57.440 回答
7

如果您使用的是Visual Studio

  • 显示您的文件属性(单击您的文件或右键单击它,然后选择属性
  • Copy to Output Directory属性中选择Copy alwaysCopy if newer

在构建时,该文件将被复制到 bin 目录:Debug 或 Release...

于 2017-10-05T13:56:35.230 回答
0

不一定是直接的答案,但我强烈建议不要使用烘焙的“发布”机制,而是连接一个构建脚本(可能在 powershell 中),它可以满足您的所有需求。连接到 MSBuild 和 nUnit 以及复制文件和移动它们真的很容易。

POWERSHELL(粗略)示例。

# Get Directory Location
$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path

# Build the application using MSBuild
cmd /c C:\Windows\Microsoft.NET\Framework\$v4_net_version\msbuild.exe "$directorypath\MyProject.sln" /p:Configuration=Release 

# Run the tests using nUnit
cmd /c $directorypath\build\nunit\nunit-console.exe $solutionPath\MyProject.Tests\bin\debug\MyProject.Tests.dll

# Copy the license to the appropriate directory
Copy-Item -LiteralPath "$directorypath\mylicensefile.txt" "$directorypath\bin\release" -Force 

# NOTE: You are going to have to adjust this to match your solution and projects.
于 2013-08-07T18:52:41.053 回答
0

在 Microsoft Connect 上的这篇文章中,答案要简单得多: Unit Test 中引用的程序集未在 TestResults/Out 中复制

所以我做了以下事情:

[TestClass]
[DeploymentItem("Some.dll")]
public class SomeTests
{
...
}

这对我来说可以。希望它有所帮助。

于 2013-12-20T12:20:47.097 回答