ChatGPT解决这个技术问题 Extra ChatGPT

Visual Studio 生成后事件 - 复制到相对目录位置

在成功构建时,我希望将输出目录的内容复制到同一“基本”文件夹下的不同位置。此父文件夹是一个相对部分,可能会因源代码管理设置而异。

我列出了一些可供我使用的宏值...

$(SolutionDir) = D:\GlobalDir\Version\AppName\Solution1\build

$(ProjectDir) = D:\GlobalDir\Version\AppName\Solution1\Version\ProjectA\

我想将输出目录内容复制到以下文件夹:

D:\GlobalDir\Version\AppName\Solution2\Project\Dependency

需要从上述宏之一中获取基本位置“D:\GlobalDir\Version\AppName”。但是,没有一个宏值仅列出父位置。

如何仅提取构建后复制命令的基本位置?


L
Lucas B

这是您要放入项目的构建后事件命令行中的内容:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

编辑:或者如果您的目标名称与项目名称不同。

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"

它对我不起作用,因为我忘记了 /Y。感谢您显示整个命令。
可以将 xcopy 与通配符和适当的开关一起使用以获得类似的结果,同时保持源文件夹的(树)结构,例如:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
+1 引号(如果你的路径有空格)和 /Y 在覆盖的情况下强制。
我建议在源代码部分使用 $(TargetName) 而不是 $(ProjectName) 。
更新到我的上一个。评论: copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\" ,没有额外的反斜杠,因为 $(SolutionDir) 包含尾随反斜杠(至少在 VS2012 中)
R
RubberDuck

如果没有任何 TargetDir 或其他宏指向正确的位置,请使用“..”目录向后移动文件夹层次结构。

IE。使用 $(SolutionDir)\..\.. 获取您的基本目录。

有关所有宏的列表,请参见此处:

http://msdn.microsoft.com/en-us/library/c02as0cs.aspx


V
Vitalii Vasylenko

你可以试试:

$(SolutionDir)..\..\

请记住,变量 $(SolutionDir) 已经有反斜杠。来源:“解决方案的目录(使用驱动器和路径定义);包括尾部反斜杠 '\'。” msdn.microsoft.com/en-us/library/42x5kfw4.aspx
d
drzaus

我认为这是相关的,但是在直接使用 msbuild 命令行(从批处理文件)构建与从 VS 中构建时遇到了问题。

使用类似以下内容:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>

(注意:start XCOPY 而不是 XCOPY 用于解决阻止复制的权限问题)

从批处理文件执行 msbuild 时,宏 $(SolutionDir) 评估为 ..\,导致 XCOPY 命令失败。在 Visual Studio 中构建时,它可以正常工作。使用 /verbosity:diagnostic 确认以查看评估的输出。

使用宏 $(ProjectDir)..\ 代替,这相当于同一件事,工作正常,并在两个构建方案中保留了完整路径。


交叉链接到 same hack 以防我忘记给予信用...
Start 为我工作(在共享文件夹中为 xcopy)。
R
Rihan Meij

直接使用 msbuild 没有意义吗?如果您对每个构建都执行此操作,那么您可以在最后添加一个 msbuild 任务吗?如果您只想查看是否找不到 Visual Studio IDE 上未显示的另一个宏值,您可以将 msbuild 选项切换为诊断,这将显示您可以使用的所有变量,如以及它们的当前值。

要在 Visual Studio 中打开此功能,请转到工具/选项,然后向下滚动树视图到名为项目和解决方案的部分,展开该部分并单击构建并运行,在右侧它们是指定构建输出详细程度的下拉菜单,将其设置为诊断,将显示您可以使用的其他宏值。

因为我不太清楚你想达到什么水平,以及你希望你的构建有多复杂,所以这可能会给你一些想法。我最近一直在做构建脚本,甚至在构建过程中执行 SQL 代码。如果您需要更多帮助甚至一些示例构建脚本,请告诉我,但如果它只是您想在构建结束时运行的一个小过程,那么完整的 msbuild 脚本可能有点过头了.

希望对日韩有帮助


thx Rihan,但显然 VS 2003 似乎不支持这一点!我当然对后期构建事件很满意;-)
我没有意识到它是 vs2003,因此使用 msbuild 作为可能的解决方案,如果我记得 vs2003 是在 msbuild 时代之前?感谢您的回复。祝你在 VS 2003 上好运,转到 VS2005 后我没有回头
F
Felipe Diniz

我通过重新安装 VS 解决了我的问题,然后下载了 .Net Core(3.x 和 2.x)sdk 包


O
Ozan BAYRAM

这是我的后期构建脚本

为我自己创建自定义路径。包括库和版本。复制 .dll(目标文件) 复制 *.md 文件。

脚本:

md c:\_References\$(ProjectName)\$(AssemblyVersion)
xcopy $(ProjectDir)$(OutDir)$(TargetFileName) c:\_References\$(ProjectName)\$(AssemblyVersion) /y
xcopy $(ProjectDir)*.md c:\_References\$(ProjectName)\$(AssemblyVersion) /y